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:获取特定逻辑矩阵的所有排列的主要内容,如果未能解决你的问题,请参考以下文章