矩阵的映射值?

Mapping values of a matrix?

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

  439105     1053224
  439105     1696241
  439105      580064
  439105     1464748
 1836139     1593258
 1464748      439105
 1464748     1053224
 1464748     1696241
 1464748      580064
  580064      439105

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

110 503
402 110
300 900
300 402
402 110

我希望它映射到:

1 4
3 1
2 5
2 3 
3 1 

问题是我是 Matlab 的初学者,我不知道该怎么做。我调查了 reshape and sub2ind,但我真的不认为这就是我要找的东西。我如何在 Matlab 中完成这个?

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

对于这样的问题,函数 unique 是你的朋友。输入 help unique 获取更多信息。

对于这道题,如果你有输入:

input = [[110 503];
         [402 110];
         [300 900];
         [300 402];
         [402 110]];

您可以通过如下方式得到想要的映射:

output = input;
[C,IA,IC] = unique(input(:));
output(:) = IC;

这将产生所需的输出:

output =
 1     4
 3     1
 2     5
 2     3
 3     1

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

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

你可以使用unique的第三个输出来达到这个目的,它只需要整形。

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

[~,~,D]=unique(A);
reshape(D,size(A))