查找数字排列的差异并按结果排序

时间:2016-03-26 13:17:25

标签: matlab octave permutation combinatorics

我在数组中有几个数字,我想找到差异 在每一个之间并按最低结果排序(我不想重复项目)。我尝试使用命令“perms”,因为它获得了所有的排列

v = [120;124;130];
p = perms(v)

但它似乎没有按照我想要的方式工作。有没有人有任何其他建议

实施例: 我有3个数字 a = [120,124,130] (请注意可能有数百个数字),它会找到数字之间的差异,然后按结果排序。计算结果如下所示。

124-120 =4
130-124 =6
130-120 =10

所以最终的数组b看起来就像下面的数组

b=
    [124 120 4
    130 124 6
    130 120 10]

PS:我正在使用octave 3.8.1,就像matlab

2 个答案:

答案 0 :(得分:0)

我们可以使用PDIST函数计算成对距离,然后使用ndgridtril的组合来获取向量原始值的索引。最后,我们根据距离进行排序:

v = [120;124;130];
D = pdist(v, 'cityblock');
[a,b] = ndgrid(1:numel(v), 1:numel(v));
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) D(:)], 3)

答案 1 :(得分:0)

对于那些无法加载统计工具​​箱的人,谢谢@Amro

v = [120;124.6;130];
%taken out from pdist.m from statistics package
order = nchoosek(1:rows(v),2);
Xi = order(:,1);
Yi = order(:,2);
X = v';
d = X(:,Xi) - X(:,Yi);
y = norm (d, "cols");

[a,b] = ndgrid(1:numel(v), 1:numel(v));
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) y(:)], 3)

out=
    124.6000   120.0000     4.6000
       130.0000   124.6000     5.4000
       130.0000   120.0000    10.0000