使用2D矩阵排序3D矩阵

时间:2014-10-10 09:02:34

标签: arrays matlab matrix vector 3d

您好我正在尝试使用2D坐标矩阵(2列和无限行)中的排序对3D坐标矩阵(3列和无限行)进行排序:

A=[x1 y1 z1;x2 y2 z2;xn yn zn];

B=[xn yn;x1 y1;x2 y2];

示例:

A = [87 45 47; 87 66 47; 80 40 48; 81 41 48; 87 45 48; 87 66 48; 69 39 49; 73 39 49; 79 40 49; 81 71 49; 86 67 49; 70 39 50; 74 38 50; 79 40 50; 82 70 50; 85 68 50; 71 39 51; 75 38 51];

B = [87 45; 87 45; 81 41; 80 40; 79 40; 79 40; 75 38; 74 38; 73 39; 71 39; 70 39; 69 39; 87 66; 87 66; 86 67 ; 85 68; 82 70; 81 71];

我想基于B对A进行排序,这意味着我希望A最终成为:

Anew=[xn yn zn;x1 y1 z1;x2 y2 z2];

这是我的数据的一个例子。 A是xyz坐标的矩阵,B只是xy。

他们是否采取任何行动,或者有人可以尝试帮助我?

编辑:我使用了Jan提出的方法及其工作原理。如果我在初始帖子中没有提供足够的信息,那么谢谢你,对不起。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想重新排序A的行,使得这个矩阵的前两列等于(因此匹配)矩阵B的顺序。首先,B中的行是不是唯一的,所以解决方案不会是唯一的。

无论如何,一种方法将涉及对两行进行排序以获得所需的新排序。这种方法有点麻烦,但是这样工作:

首先,在A(:,1:2)B上的排序操作后获取排序:

[~, orderA] = sortrows(A(:,1:2));
[~, orderB] = sortrows(B);

然后,获取'反转'第二次排序:

[~,orderBinv] = sort(orderB);

现在,为了使A(:,1:2)的排序等于B的排序,您可以将逆排序和排序组合在一起:

Anew = A(orderA(orderBinv),:)

好的,我们在这里做的是:采取逆排序,以便B的排序版本产生原始版本。已排序的B与已排序的A(:,1:2)匹配(如果是唯一行),因此将此顺序应用于排序A产生的排序可为我们提供所需的结果。


因此,对于给定的A'(为方便阅读而转换)

87    87    80    81    87    87    69    73    79    81    86    70    74    79    82    85    71    75
45    66    40    41    45    66    39    39    40    71    67    39    38    40    70    68    39    38
47    47    48    48    48    48    49    49    49    49    49    50    50    50    50    50    51    51

B'

87    87    81    80    79    79    75    74    73    71    70    69    87    87    86    85    82    81
45    45    41    40    40    40    38    38    39    39    39    39    66    66    67    68    70    71

结果Anew'等于

87    87    81    80    79    79    75    74    73    71    70    69    87    87    86    85    82    81
45    45    41    40    40    40    38    38    39    39    39    39    66    66    67    68    70    71
47    48    48    48    49    50    51    50    49    51    50    49    47    48    49    50    50    49