如何在循环中分离组合?

时间:2015-08-11 10:47:58

标签: matlab combinatorics

假设我有4个地点,x = rand(4,1)。对于每个位置,我想计算到其他3个位置d = pdist(x, 'euclidean')的距离。这给了我6个独特的距离,例如。 12,13,14,23,24,34。 如何分离这些组合,以便从相应的位置1,2,3到其他位置获得所有距离。所以结果应该是这样的:

[1 2 3]
[4 5]
[6]

2 个答案:

答案 0 :(得分:1)

也许squareform就是你所追求的。它将所有距离解包成方形对称矩阵:

>> x = rand(4,1)
x =
    0.5290
    0.5673
    0.4487
    0.9872
>> d = pdist(x, 'euclidean')
d =
    0.0383    0.0802    0.4582    0.1186    0.4199    0.5384
>> D = squareform(d)
D =
         0    0.0383    0.0802    0.4582
    0.0383         0    0.1186    0.4199
    0.0802    0.1186         0    0.5384
    0.4582    0.4199    0.5384         0

所以例如D(2,3)(或D(3,2))是从第2点到第3点的距离。

答案 1 :(得分:0)

使用所有6种组合idx = [1 2 3 4 5 6]创建索引。为每个循环(idx(1:Num-n) = [])分别删除此索引中的前3个,2个,1个元素。

Num = 4;
idx = 1:nchoosek(Num,2); % index of all combinations
for n = 1:Num-1 % loop through all except last
    idx(1:Num-n) % print
    idx(1:Num-n) = []; % remove the first elements in index
end

这将给出以下结果

ans = 1     2     3
ans = 4     5
ans = 6