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

tim*_*tim 4 matlab combinations permutation

让我们假设我有以下逻辑矩阵:

log = [1 1 0; 
       0 1 1; 
       1 0 1; 
       0 0 1];
Run Code Online (Sandbox Code Playgroud)

列描述了类似篮子的东西,单行描述了某些属性(例如不同颜色的球)可以放入那些篮子中的物体.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或对象.3
  • 篮子3:可以包含对象2,obj.3或obj.4

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

1 0 2
1 0 3
1 0 4
2 0 2
2 0 3
2 0 4
Run Code Online (Sandbox Code Playgroud)

如何使这成为一个很好的算法,适应任意数量的篮子和对象?我只能想到嵌套和丑陋的循环:(非常感谢!

Oli*_*Oli 5

你可以用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
Run Code Online (Sandbox Code Playgroud)

要回答完整的问题,您需要[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))
Run Code Online (Sandbox Code Playgroud)

篮子=

 1     0     2
 3     0     2
 1     0     3
 3     0     3
 1     0     4
 3     0     4
Run Code Online (Sandbox Code Playgroud)