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]:
所以我有以下几种可能性:
总而言之,我有完整的排列(一行描述一个排列,列描述篮子,数字描述对象):
1 0 2
1 0 3
1 0 4
2 0 2
2 0 3
2 0 4
Run Code Online (Sandbox Code Playgroud)
如何使这成为一个很好的算法,适应任意数量的篮子和对象?我只能想到嵌套和丑陋的循环:(非常感谢!
你可以用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)
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |