获取/比较matlab / octave数组的差异

时间:2014-06-02 15:03:04

标签: arrays matlab multidimensional-array octave

我有两个数组A和B,我希望在A的第一列中找到最接近B中第一列中值的值,并按差异/接近度对它们进行排序。

示例:A为29x2,B为14x2

A=[0, 2;
408, 642;
492, 66;
1527, 108;
1560, 16;
1755, 182;
1809, 10;
2133, 42;
2235, 444;
2289, 4191;
2334, 86;
2661, 22;
2709, 2;
2787, 2652;
3072, 200;
3081, 110;
3147, 638;
3963, 10;
4080, 2;
4332, 1674;
4462, 14;
5148, 1042;
5649, 8;
5895, 44;
6078, 284;
6315, 2;
6989, 4;
7485, 46;
7623, 3458;
];


B= [0, 2;
165, 2114;
572, 122;
576, 5416;
581, 176;
583, 278;
653, 28;
655, 4;
656, 154;
657, 16;
658, 4188;
665, 3475;
903, 20;
1145, 8;
]

最终数组需要按其中最近/最近的x值(第1列)进行排序。 所以当生成 C数组时,它会有 [0,0; ​​492,572]等......

我提供了两个图来给出一个图形示例。第一个图显示A和B的所有数据点表示为星和圆,第二个图放大以显示阵列之间的最近点 最后一个数组将包含以橙色圈出的项目。 (请忽略图中的y轴,我只对x轴上值的接近程度感兴趣)

如何使用matlab / octave创建 C数组

Figure 1 full plot

Figure 2 zoomed in plot

2 个答案:

答案 0 :(得分:2)

bsxfun 方法 -

%// Find the minimum absolute diferences and corresponding indices for each
%// element in the first column of B against all other elements in the 
%// first column of A.
[min_val,min_ind] = min(abs(bsxfun(@minus,A(:,1),B(:,1)'))) %//'

%// Find the sorted indices for the minimum absolute diferences
[~,sorted_ind] = sort(min_val)

%// Index into A using min_ind to assciate each element in the first
%// column of B against the corresponding closest element in the first
%// column of A.
C = [A(min_ind,1) B(:,1)]

%// Sort rows of C acoording to sorted_indices to have the desired output
C = C(sorted_ind,:)

使用 pdist2 [两组观察之间的成对距离]的替代方法,只需要对上述代码进行一次更改 -

[min_val,min_ind] = min(pdist2(A(:,1),B(:,1)))

答案 1 :(得分:1)

要在A中找到与B中的每个值对应的最近点,请使用interp1模式nearest

AnearB = interp1(A(:,1), A(:,1), B(:,1), 'nearest');
C = [AnearB B(:,1)];

然后按亲密度对结果进行排序。

dist = abs(diff(C'));
[~, order] = sort(dist);
C = C(order,:);

您的样本数据的结果

C =

           0           0
         492         572
         492         576
         492         581
         492         583
         492         653
         492         655
         492         656
           0         165
         492         657
         492         658
         492         665
        1527        1145
         492         903