如何取数据从多个向量的所有组合呢

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)。如果我知道向量的个数和每个向量的长度,这是容易的程序。然而,我想写一个通用的代码,可以找到所有这些组合无论向量的数量和它们各自的长度
2的评论

登录置评。

接受的答案

约翰D 'Errico
约翰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评论
진환유
진환유 2022年3月16日
这对我来说真的很有用。谢谢你的好的解决方案!

登录置评。

更多的答案(3)

亚当Danz
亚当Danz 2019年8月13日
编辑:亚当Danz 2023年4月4日
这里有两个解决方案R202万博 尤文图斯3a之前/之后。
使用 组合 在MATLAB R2023a或更高版本
%演示数据
一个= 1:3;
b = 11:13;
c = 4:1;
d = 9;
allCombinations =组合(a, b, c, d)
allCombinations =54×4表
一个 b c d _ __ __ _1 11 4 9 1 11 3 9 1 11 2 9 11 1 9 1 11 0 9 11 1 9 1 12 4 9 1 12 3 9 1 12 2 9 12 1 9 1 12 0 9 12 1 9 1 13 4 9 1 13 3 9 1 13 2 9 1 13 1 9
之前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(子)
allPerms = 54×4
1 11 4 9 2 11 4 9 3 11 4 9 1 12 4 9 2 12 4 9 3 12 4 9 1 13 4 9 2 13 4 9 3 13 4 9 1 11 3 9
比较结果
组合() 生成一个表和我的第二个解决方案会产生一个矩阵行以不同的顺序。这里我将度假表的行匹配矩阵的行,我们会确认两种解决方案都是平等的。万博 尤文图斯
allCombinationsMat = sortrows (allCombinations {:,:}, [4 3 2 1]);
isequal (allCombinationsMat allPerms)
ans =逻辑
1
2的评论
亚当Danz
亚当Danz 2019年8月14日
听起来不错。所以你的变量” x “变量” allVecs ”。你有什么困难实现其他的解决方案吗?

登录置评。


布鲁诺陈德良
布鲁诺陈德良 2019年8月13日
编辑:布鲁诺陈德良 2019年8月13日
= (1 2 3),b = [4 5 6 7], c = [8 9 10 11 12]
C = {a, b, C};%向量
n =长度(C);
[C {:}] = ndgrid (C {:});
C =重塑(猫(n + 1 C {:}), [], n)
2的评论
布鲁诺陈德良
布鲁诺陈德良 2022年3月16日
“我们可以限制笔行吗?”
简单的预滤器你想保持之后(如和极限)。

登录置评。


克里斯
克里斯 2019年8月14日
我使用 allcomb 从交换——伟大的工作。使用字符。它使用的ndgrid引擎盖下,可能主要是打包其他版本的代码所示。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!