例如
我有一个矢量:
a=[4 4 15 15 9 9 7 7];
如何有效地将所有4s替换为1s,将15s全部替换为2s,将9s替换为3s,将7s替换为4s?而不是重复编码:
a(a==4)=1; a(a==15)=2; a(a==9)=3; a(a==7)=4; ....
如果我有太多要替换的号码?
非常感谢!
答案 0 :(得分:8)
如果你真的想要一个“abitrary”替换,那么原始值和替换值之间没有直接关系,你可以使用ismember
:
>> map = [4 1; 15 2; 9 3; 7 4];
>> [~, loc] = ismember(a, map(:,1));
>> a(:) = map(loc,2)
a =
1 1 2 2 3 3 4 4
根据您的较大背景,您可能需要检查unique
,因为您似乎在做类似的事情。在这种情况下,例如:
>> [~,~,a2] = unique(a, 'stable')
a2 =
1 1 2 2 3 3 4 4
哪个适用于您的示例,并且不需要您根据外观顺序构建地图,因为它使其成为自己的地图。
或者,如果您的Matlab版本早于unique的'stable'
属性,那么
>> [~,~,a2] = unique(a)
a2 =
1 1 4 4 3 3 2 2
这与您的替换类似,尽管这些数字是指a
中不同元素的排序列表中每个元素的索引,而您的示例似乎使用未排序的索引 - 虽然这可能只是你的例子的任意选择。
答案 1 :(得分:3)
changem (Substitute values in data array)
中有一个内置Mapping Toolbox
的MATLAB用于此目的 -
changem(input_arr,newvals,oldvals)
示例运行 -
>> a
a =
4 4 15 15 9 9 7 7
>> oldvals = [4,15,9,7];
>> newvals = [1, 2,3,4];
>> changem(a,newvals,oldvals)
ans =
1 1 2 2 3 3 4 4
如果您无法访问Mapping Toolbox
,或者您正在寻找矢量化解决方案,我建议您Vectorized implementation of CHANGEM with bsxfun, max
。