映射矩阵的值?

oce*_*800 8 mapping matlab matrix

所以我有一个大矩阵(4091252x2)看起来像这样:

  439105     1053224
  439105     1696241
  439105      580064
  439105     1464748
 1836139     1593258
 1464748      439105
 1464748     1053224
 1464748     1696241
 1464748      580064
  580064      439105
Run Code Online (Sandbox Code Playgroud)

基本上,矩阵表示从一个人到另一个人的呼叫,由personID表示(439105调用1053224).我想要做的是缩小这个矩阵,使最小的personID = 1,下一个最低的personID为2,之后的下一个最低的personID为3,等等.例如,如果矩阵看起来像这样:

110 503
402 110
300 900
300 402
402 110
Run Code Online (Sandbox Code Playgroud)

我希望它映射到:

1 4
3 1
2 5
2 3 
3 1 
Run Code Online (Sandbox Code Playgroud)

问题是我是Matlab的初学者,我不知道如何做到这一点.我调查了重塑sub2ind,但我真的不认为那就是我正在寻找的东西.我将如何在Matlab中实现这一目标?

任何帮助将不胜感激,谢谢!

Dav*_*vid 7

您可以使用第三个输出来unique实现此目的,它只需要重新整形.

A=[110 503
402 110
300 900
300 402]

[~,~,D]=unique(A);
reshape(D,size(A))
Run Code Online (Sandbox Code Playgroud)

  • 如果您想按第一列中的值排序ID,请在末尾使用`sortrows`.此外,`unique`的`'stable'`选项也可用于获得不同的排序. (2认同)

Ton*_*ony 6

对于这样的问题,该功能unique是你的朋友.输入help unique以获取更多信息.

对于此问题,如果您有输入:

input = [[110 503];
         [402 110];
         [300 900];
         [300 402];
         [402 110]];
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式获得所需的映射:

output = input;
[C,IA,IC] = unique(input(:));
output(:) = IC;
Run Code Online (Sandbox Code Playgroud)

这将产生所需的输出:

output =
 1     4
 3     1
 2     5
 2     3
 3     1
Run Code Online (Sandbox Code Playgroud)

IC包含索引(即"IC"中的"I"),因此它们将是从1到输入数组中唯一值的数量的值.如果您想使用其他一些令牌,可以使用IC索引另一个唯一标识符数组.

仅供参考,在我的Macbook Pro上,在4091252x2阵列上执行此操作大约需要1.2秒.