如何取数据从多个向量的所有组合呢
53视图(30天)
显示旧的评论
我有一个数量的向量,可能有不同的长度,例如,a = (1 2 3), b =(4 5 6 7)和c = [8 9 10 11 12]。从a, b和c我有3 * 4 * 5 = 60分,例如,一种可能性是(1、4、8)。如果我知道向量的个数和每个向量的长度,这是容易的程序。然而,我想写一个通用的代码,可以找到所有这些组合无论向量的数量和它们各自的长度
接受的答案
约翰D 'Errico
2019年8月13日
不要单独存储向量。相反,学会使用工具如细胞阵列,这让事情非常高效。
V = {(1 2 3), (4 5 6 7], [8 9 10 11 12]};
接下来,如何使用一个单元阵列为这个目的吗?你通过元素到ndgrid,使用所谓的acomma分隔的列表。(或meshgrid)。这就是你得到当你输入V{:},一个逗号分隔的列表。它允许您通过细胞数组的每个元素为一个函数如果细胞数组的每个元素是一个参数的函数。
例如,如果我们这样做:
[G1, G2, G3] = ndgrid (V {:});
嗯。创建了三个不同的数组,包含所有的组合这些向量的元素,如果你仔细观察。但是我们不想将结果分成n不同命名数组。我们想要一个单元阵列作为输出。现在,试试这个:
C =细胞(1,元素个数(V));
V (C {}): = ndgrid ({}):
C =
1×3单元数组
{3×4×5双}{3×4×5双}{3×4×5双}
更好。我们已抓获ndgrid回单元阵列的输出。但是我们可能想要的是一个平面阵列,与三列,这里,60行。我们可以将每个数组转换成一个列向量也非常容易。
C = cellfun (@ (X)重塑(X, [], 1), C,“UniformOutput”假)
C =
1×3单元数组
{60×1双}{60×1双}{60×1双}
最后,C转换成一个平面阵列,使用像horzcat这样的工具。(方括号就足够了。这是……
C = horzcat (C {:})
C =
1 4 8
2 4 8
3 4 8
1 5 8
2 5 8
3 5 8
1 6 8
2 6 8
3 6 8
1 7 8
2 7 8
3 7 8
1 4 9
2 4 9
3 4 9
1 5 9
…
2 7 12
3 7 12
你应该看到,我做的是依赖于数组的大小,长度的向量,向量的数量不同。这都是由我创建一个初始单元阵列。学习使用MATLAB,因为它是设计用于。
更多的答案(3)
亚当Danz
2019年8月13日
编辑:亚当Danz
2023年4月4日
这里有两个解决方案R202万博 尤文图斯3a之前/之后。
%演示数据
一个= 1:3;
b = 11:13;
c = 4:1;
d = 9;
allCombinations =组合(a, b, c, d)
之前R2023a
这个解决方案单元阵列中的所有向量和使用的地方
ndgrid
创建排列。查看更详细的评论。T
%使用上面创建的相同的演示数据。
%把所有向量到单元阵列
allVecs = {a, b, c, d};
子=细胞(1,元素个数(allVecs));
(子{}):= ndgrid (allVecs {:});
子= cellfun (@ (x) x(:),接头,“UniformOutput”、假);
% allPerms [m x n]矩阵m n向量的排列
% m应该等于刺激(cellfun (@numel allVecs))
% n应该等于元素个数(allVecs)
allPerms = cell2mat(子)
比较结果
组合()
生成一个表和我的第二个解决方案会产生一个矩阵行以不同的顺序。这里我将度假表的行匹配矩阵的行,我们会确认两种解决方案都是平等的。万博 尤文图斯
allCombinationsMat = sortrows (allCombinations {:,:}, [4 3 2 1]);
isequal (allCombinationsMat allPerms)