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中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????