matlab:获取特定逻辑矩阵的所有排列

Posted

技术标签:

【中文标题】matlab:获取特定逻辑矩阵的所有排列【英文标题】:matlab: get all permutations for a specific logical matrix 【发布时间】:2012-03-19 00:42:39 【问题描述】:

假设我有以下逻辑矩阵:

log = [1 1 0; 
       0 1 1; 
       1 0 1; 
       0 0 1];

列描述类似于篮子的东西,而单行描述一些由特定属性标识的对象(例如不同颜色的球),您可以放入这些篮子。 1表示,可以放入(放入专栏描述的篮子),0则不能。

每个篮子一次只能包含一个对象。 我想知道如何计算如何为给定配置放入对象的排列,这意味着我说:I want to have objects in basket 1 and 3 but none in basket 2, which would be [1 0 1]:

所以我有以下几种可能:

购物篮 2:0 件 篮子 1:可以包含对象 1 或 obj。 3 篮子 3:可以包含对象 2,obj。 3 或对象。 4

总而言之,我有完整的排列(一行描述一个排列,列描述篮子,数字描述对象):

1 0 2
1 0 3
1 0 4
2 0 2
2 0 3
2 0 4

如何把它变成一个很好的算法,适应任意数量的篮子和物体?我只能想到嵌套和丑陋的循环:( 非常感谢!

【问题讨论】:

在最终答案的第一列中,是不是 [1 1 1 3 3 3]' 而不是 [1 1 1 2 2 2]'? 【参考方案1】:

您可以使用ndgrid。此功能完全符合您的要求。

[b1 b2 b3]=ndgrid([1 2],[0],[2 3 4]);
[b1(:) b2(:) b3(:)]

ans =

 1     0     2
 2     0     2
 1     0     3
 2     0     3
 1     0     4
 2     0     4

要回答你完整的问题,你需要从你的日志变量中获取[1 2],[0],[2 3 4]

log = [1 1 0; 
   0 1 1; 
   1 0 1; 
   0 0 1];
 log=bsxfun(@times,log,[1 0 1]);
 poss=cellfun(@find,mat2cell(log,size(log,1),ones(1,size(log,2))),'UniformOutput',0)
 poss(cellfun(@isempty,poss))=0
 basket=cell(1,size(log,2));
 [basket:]=ndgrid(poss:);
 basket=cell2mat(cellfun(@(x) x(:),basket,'UniformOutput',0))

篮子 =

 1     0     2
 3     0     2
 1     0     3
 3     0     3
 1     0     4
 3     0     4

【讨论】:

看起来很有趣,但我究竟要如何将任意输入的结果合并? 感谢编辑Oli,篮子多了怎么适应?我不能在我的程序语句中动态更改输出变量的数量,可以吗?! 再次感谢,但我的第二条评论的问题仍然存在。添加一个篮子,代码不能自动适应,因为 b1...b3 是硬编码的。 谢谢,但仍然很棒。永远不会想出这样的想法。现在将根据 bdecaf 的递归函数对其进行测试【参考方案2】:

我会递归实现:

function out = permlog(log,bag)
if bag(1)==0
    curr=0;
else
    curr = find(log(:,1));
end
if size(log,2)==1
    out = curr;
    return
else
    add = permlog(log(:,2:end),bag(2:end));
    out = [];
    for i=1:numel(curr)
        tmp = [repmat(curr(i),size(add,1),1),add];
        out =[out;tmp];
    end
end

给出你描述的输出:

permlog(log,[1,0,1])

ans =

     1     0     2
     1     0     3
     1     0     4
     3     0     2
     3     0     3
     3     0     4

【讨论】:

好的,谢谢你们,两个很好的解决方案。我想说我更喜欢使用 ndgrid,因为它是内置的,但不知何故,您的解决方案更快,尤其是对于相当小的矩阵。所以我勾选接受,因为我使用更快的...谢谢大家【参考方案3】:

现在也在文件交换中找到了一些东西:http://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb/content/allcomb.m 这有点像 Olis 通过 ndgrid 提出的建议。

【讨论】:

以上是关于matlab:获取特定逻辑矩阵的所有排列的主要内容,如果未能解决你的问题,请参考以下文章

Matlab:二进制矩阵的所有组合

获取特定范围/半径内的所有行(文档术语矩阵)

利用matlab对二维矩阵进行计算分析

如何在MATLAB中获取特定目录下的所有文件?

matlab里repmat(1:10,40,1)是啥意思

在matlab中从大到小排序