假设我有一个定义如下的矩阵
M = [C1 C2 C3 C4]
C是列向量 我想要一些有效的(即没有for循环)方法来产生A矢量,这样
ResultVec = [C1 C2;
C1 C3;
C1 C4;
C2 C3;
C2 C4;
C3 C4]
提前致谢!
答案 0 :(得分:10)
即nchoosek
做的事情:
M = [ 1 2 3 4 ];
R = nchoosek(M,2);
返回:
R =
1 2
1 3
1 4
2 3
2 4
3 4
我不知道这是否是你的意图,但是nchoosek
是Matlabs实现的 来自n个元素的给定集合S中的k组合的数量,没有重复 (Wikipedia)
虽然功能nchoosek
在性能方面不是很有效。但是在File Exchange上有等价物,它们(!!)的速度更快,并且做得更好。
为了说清楚,它不仅适用于上面相当简单的例子,而且不会返回任何索引。它可以根据需要直接转换矩阵。
M = [ 21 42 123 17 ];
返回:
R =
21 42
21 123
21 17
42 123
42 17
123 17
答案 1 :(得分:4)
这是我提出的最简单的方法:
n = size(M, 2);
[j, i] = ind2sub([n n], find(~triu(ones(n))));
ResultVec = M(:, [i j]);
ResultVec = reshape(ResultVec, [], 2)