您好我正在尝试使用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提出的方法及其工作原理。如果我在初始帖子中没有提供足够的信息,那么谢谢你,对不起。
答案 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