什么是用另一个向量中的项替换向量中的项目最简洁的方法?

时间:2016-03-11 12:01:14

标签: matlab vectorization

说,我有一个mxn矩阵M,其列1包含-1,0,4,12,27 ......等值,它们可以多次出现。这些不是顺序数字,所以我想用M对应的自然数替换它们出现的任何地方(即,列中的最小值应该替换为1,第二个最小值替换为2,第三个最小值替换为3,因此上)。

我可以使用在列长度上运行的for循环轻松地执行此操作,并为列中的每个唯一值写入替换条件:

for i=1:size(unique(M(:,1)),1)
    M(M(:,1)==-1)=1;
    M(M(:,1)==0)=2;
    M(M(:,1)==4)=3;
    M(M(:,1)==12)=4;
    M(M(:,1)==27)=5;
    ...
    ...
    ...
end

但是,如果列中的唯一元素数量很大,这可能会变得乏味。我想知道一种更好,更简洁的方法,利用MATLAB矢量化。因此,我尝试使用changem函数用自然数替换原始数据中的所有值:

changem(M(:,1), unique(M(:,1))', [1:1:numel(unique(M(:,1)))]);

但这不起作用。它只替换M.中的前2或3个唯一数字?为什么?

编辑:示例示例。说我的矩阵M的前几行如下:

91  620011  sunday  1.43309E+12     
92  620194  sunday  1.43309E+12 25.0048276  121.3041219
91  620072  sunday  1433087996  25.038848   121.455705
91  620177  sunday  1.43309E+12     
91  620268  sunday  1.43309E+12 24.79293518 120.9506341
92  620266  sunday  1433087991      
107 620092  sunday  1.43309E+12 24.86219998 120.9648107
1   36581192    sunday  1433087990      
91  620268  sunday  1.43309E+12     
91  619897  sunday  1.43309E+12 24.9161251  121.2068644

然后,假设0是最小元素,91是第10个最小元素,92是第11个最小元素,107是第15个最小元素,我希望矩阵成为这个:

10  620011  sunday  1.43309E+12     
11  620194  sunday  1.43309E+12 25.0048276  121.3041219
10  620072  sunday  1433087996  25.038848   121.455705
10  620177  sunday  1.43309E+12     
10  620268  sunday  1.43309E+12 24.79293518 120.9506341
11  620266  sunday  1433087991      
15  620092  sunday  1.43309E+12 24.86219998 120.9648107
1   36581192    sunday  1433087990      
10  620268  sunday  1.43309E+12     
10  619897  sunday  1.43309E+12 24.9161251  121.2068644

2 个答案:

答案 0 :(得分:1)

unique的第三个输出应该为你做:

[~,~,M(:,1)] = unique(M(:,1))

答案 1 :(得分:0)

编辑:

首先列出一个大清单:

public void someMethod(String a)
{
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    Object s1 = "some string";
    Object s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}

public void someOtherMethod(String a)
{
    String s1 = "some string";
    GString s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}

然后对其进行排序:

B = reshape(M,[],m*n)

制作一张矩阵:

[~,key] = sort(B)

现在不能测试,对不起

如果您使用[B,key] = sort(___),则_M = reshape(key,size(M)) 是您想要的矢量