MATLAB:任意数量的元胞数组的组合

Posted

技术标签:

【中文标题】MATLAB:任意数量的元胞数组的组合【英文标题】:MATLAB: Combinations of an arbitrary number of cell arrays 【发布时间】: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 - Generate all possible combinations of the elements of some vectors、MATLAB: Enumerating All Combinations of Items in An Arbitrary Number of Sets、How can I create all combinations of characters in sets of text?。前两个处理数字向量,第三个处理字符数组,但基本解决方案对于元胞数组实际上是相同的。 【参考方案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 的一般性回答,但您的回答对理解他的理解很有帮助。

以上是关于MATLAB:任意数量的元胞数组的组合的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB的cell(元胞数组,又名元组)是个好东西---海纳百川的容器

matlab中的元胞数组如何实现批量的赋值呢?

请问如何使用MATLAB进行元胞数组批量提取数据。

matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????

如果 MATLAB Rb2020 中的行和列维度不一致,如何取消嵌套具有嵌套数据和文本内容的元胞数组?

Matlab中元胞数组与构架数组有啥不同?