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

fog*_*rit 5 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' ;
     ... }
Run Code Online (Sandbox Code Playgroud)

该命令将能够接受任意数量的参数,并且示例中的结果将具有与函数的参数一样多的列.(当然,上面的语法仅用于说明以及任何可以生成结果的方法,无论格式适合该法案)

编辑:类似的问题已被要求矩阵而不是细胞,例如链接.许多解决方案都指向FEX提交allcomb,但所有这些解决方案都只是围绕ndgrid的包装器,它只适用于双打.对非数字集的任何建议?

gno*_*ice 6

虽然我解决这个问题在我的回答相关/近似重复的问题,我在这里发布不同版本的我的解决方案,因为它似乎你想要一个通用的解决方案,以及我的其他的答案是具体的三个输入集的情况.这是一个应该为任意数量的单元格数组输入做的事情:

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
Run Code Online (Sandbox Code Playgroud)

这就是你怎么称呼它:

>> combMat = allcombs(A, B)

combMat = 

    'a1'    'b1'
    'a1'    'b2'
    'a1'    'b3'
    'a2'    'b1'
    'a2'    'b2'
    'a2'    'b3'
Run Code Online (Sandbox Code Playgroud)


Oli*_*Oli 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'
Run Code Online (Sandbox Code Playgroud)