如何在Matlab中将小向量子集中的所有向量组合起来?
a= [5 6 7] b = [8 9 10] c=[11 12 13] d=[14 15 16] e=[17 18 19]
与b和c组合:
结果:
M1= [ 5 6 7 8 9 10 11 12 13]
a with b and d:
M2 = [5 6 7 8 9 10 14 15 16]
依旧.....
答案 0 :(得分:2)
这个答案涵盖了任意数量的向量的情况。假设向量是相等长度的行向量。
将您的示例数据定义为
a = [5 6 7]; b = [8 9 10]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19];
vectors = {a, b, c, d, e}; %// cell array with any number of row vectors of equal size
n = 3; %// desired subset size
然后:生成索引的所有组合,使用它来索引到vectors
,连接成一个大行向量,并重新整形以获得所需的结果:
combs = nchoosek(1:numel(vectors), n);
result = reshape([vectors{combs.'}], numel(vectors{1})*n, []).';
这会给出一个矩阵,其第一行是M1
,第二行是M2
等:
result =
5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 14 15 16
5 6 7 8 9 10 17 18 19
5 6 7 11 12 13 14 15 16
5 6 7 11 12 13 17 18 19
5 6 7 14 15 16 17 18 19
8 9 10 11 12 13 14 15 16
8 9 10 11 12 13 17 18 19
8 9 10 14 15 16 17 18 19
11 12 13 14 15 16 17 18 19
答案 1 :(得分:1)
您可以使用cat
功能:
res = cat(2,a,b,c);
或只是[]
语法:
res = [a b c];
在这两种情况下,res
都会包含[5 6 7 8 9 10 11 12 13]
。
最佳,
答案 2 :(得分:0)
使用nchoosek
。
a = [5 6 7]; b = [8 9]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19];
N = 3;
x = {a,b,c,d,e};
y = nchoosek(x,N);
您在阵列数组中一次将所有数组组合N
。单元格i
的每一行x
都是一个组合,所以要将其作为行向量返回
horzcat(y{i,:})
或者,如果你想把它们全部拿出并放在一个大小为n_combs
的单元格数组中
n_combs = size(y,1);
out = cell(0,n_combs);
for i = 1 : n_combs
out{i} = horzcat(1, y{i,:});
end
您要组合的数组大小没有限制,例如,您可以组合
a = [5 7]; b = [8 9]; c = [11]; d = [20 14 15 16]; e = [17 18 19];
但是,如果必须将所有组合放在矩阵中,则阵列必须具有相同的大小。在这种情况下,路易斯·门多的回答可以胜任。
最后,如果允许重复,请使用nmultichoosek代替nchoosek
。