MATLAB中是否有命令或单行策略会返回n
个单元格组件的所有组合,一次只能n
?
我想要完成的一个例子:
A = {'a1','a2'};
B = {'b1','b2','b3'};
C = combinations(A,B)
C = {'a1','b1' ;
'a1','b2' ;
'a1','b3' ;
'a2','b1' ;
'a2','b2' ;
... }
该命令可以接受任意数量的参数,示例中的结果将包含与函数参数一样多的列。 (当然,上面的语法只是为了说明和任何可以生成结果的方法,无论格式适合该法案)
编辑:类似的问题已被要求用于矩阵而不是细胞,例如link。许多解决方案指向FEX提交allcomb,但所有这些解决方案都只是围绕ndgrid的包装器,它只适用于双打。对非数字集的任何建议?
答案 0 :(得分:6)
虽然我在my answer中向related/near duplicate question解决此问题,但我在此处发布了不同版本的解决方案,因为您似乎需要通用解决方案,而我的其他答案特定于三个输入集的情况。这是一个应该为任意数量的单元阵列输入做你想要的功能:
function combMat = allcombs(varargin)
sizeVec = cellfun('prodofsize', varargin);
indices = fliplr(arrayfun(@(n) {1:n}, sizeVec));
[indices{:}] = ndgrid(indices{:});
combMat = cellfun(@(c,i) {reshape(c(i(:)), [], 1)}, ...
varargin, fliplr(indices));
combMat = [combMat{:}];
end
以下是你如何称呼它:
>> combMat = allcombs(A, B)
combMat =
'a1' 'b1'
'a1' 'b2'
'a1' 'b3'
'a2' 'b1'
'a2' 'b2'
'a2' 'b3'
答案 1 :(得分:5)
双线战略:
A = {'a1','a2'};
B = {'b1','b2','b3'};
[a b]=ndgrid(1:numel(A),1:numel(B));
C= [A(a(:))' B(b(:))']
C =
'a1' 'b1'
'a2' 'b1'
'a1' 'b2'
'a2' 'b2'
'a1' 'b3'
'a2' 'b3'