Matlab 矩阵的映射值?

Matlab 矩阵的映射值?,matlab,matrix,mapping,Matlab,Matrix,Mapping,所以我有一个大矩阵(4091252x2),看起来像这样: 439105 1053224 439105 1696241 439105 580064 439105 1464748 1836139 1593258 1464748 439105 1464748 1053224 1464748 1696241 1464748 580064 580064 439105 110 503 40

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

  439105     1053224
  439105     1696241
  439105      580064
  439105     1464748
 1836139     1593258
 1464748      439105
 1464748     1053224
 1464748     1696241
 1464748      580064
  580064      439105
110 503
402 110
300 900
300 402
402 110
基本上,矩阵表示从一个人到另一个人的呼叫,由personID表示(439105呼叫1053224)。我想做的是缩小这个矩阵,使最小的personID=1,2表示下一个最低的personID,3表示下一个最低的personID,等等。例如,如果矩阵看起来像这样:

  439105     1053224
  439105     1696241
  439105      580064
  439105     1464748
 1836139     1593258
 1464748      439105
 1464748     1053224
 1464748     1696241
 1464748      580064
  580064      439105
110 503
402 110
300 900
300 402
402 110
我希望它映射到:

1 4
3 1
2 5
2 3 
3 1 
问题是我是Matlab的初学者,我不知道怎么做。我调查了一下,但我真的认为这不是我想要的。我将如何在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))

这是一个更优雅的解决方案。对于我自己的代码,我倾向于先分配然后使用线性索引的“技巧”,只是因为它避免了使用有时会伤到我头的重塑+1@David谢谢然而,“~”代表什么?另外,如果同一个电话打了两次,这也会起作用吗?例如,402调用110两次,因此矩阵将有两行[402 110]?我只是搞不懂到底有多独特works@David没关系,我只是自己测试了一下,效果不错!非常感谢你的帮助@波浪号(~)是一个占位符,用于告诉MATLAB不要分配该输出。由于此解决方案只需要unique中的第三个输出参数,因此使用tilde忽略前两个。如果要根据第一列中的值对ID进行排序,请在末尾使用
sortrows
。此外,
唯一
稳定
选项也可用于获得不同的订购。