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中实现这一目标?
任何帮助将不胜感激,谢谢!
您可以使用第三个输出来unique实现此目的,它只需要重新整形.
A=[110 503
402 110
300 900
300 402]
[~,~,D]=unique(A);
reshape(D,size(A))
Run Code Online (Sandbox Code Playgroud)
对于这样的问题,该功能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秒.