【问题标题】:MATLAB: Combinations of an arbitrary number of cell arraysMATLAB:任意数量的元胞数组的组合
【发布时间】:2012-01-19 12:10:21
【问题描述】:

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 的包装,它只适用于双精度数。对非数字集有什么建议吗?

【问题讨论】:

标签: matlab combinations


【解决方案1】:

尽管我在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'

【讨论】:

    【解决方案2】:

    2 线策略:

     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'
    

    【讨论】:

    • 非常简单干净,我非常喜欢。我接受了 gnovice 的一般性回答,但您的回答对理解他的理解很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多