说,我有一个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
答案 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))
是您想要的矢量