MATLAB:任意数量的单元阵列的组合

时间:2011-12-13 16:06:38

标签: matlab combinations

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的包装器,它只适用于双打。对非数字集的任何建议?

2 个答案:

答案 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'