【问题标题】:sorting 3D matrix by using 2D matrix [closed]使用 2D 矩阵对 3D 矩阵进行排序 [关闭]
【发布时间】:2014-10-10 09:02:33
【问题描述】:

您好,我正在尝试使用 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 提出的方法及其工作原理。感谢您,如果我在最初的帖子中没有提供足够的信息,我们深表歉意。

【问题讨论】:

  • 请您添加一个使用实际数据的示例
  • 3D 矩阵在哪里? A 也是二维的。
  • B 是否包含 A 中的所有 x1 到 xn、y1 到 yn?这些值是否完全相同,B 中是否没有更多元素?
  • @grsgs 使用A 和B 的最小输入数据并向我们展示预期的输出Anew?请将这些信息添加到问题中,而不是作为 cmets 发布。

标签: arrays matlab matrix vector 3d


【解决方案1】:

如果我理解正确,您想对 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

【讨论】:

  • 谢谢 Jan,这就是我一直在寻找的,只是我不知道如何在 MATLAB 中做到这一点。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2016-10-27
  • 2016-12-11
相关资源
最近更新 更多