4

例如

我有一个向量:

a=[4 4 15 15 9 9 7 7];

如何有效地将所有 4 替换为 1,将所有 15 替换为 2,将 9 替换为 3,将 7 替换为 4?而不是重复编码:

a(a==4)=1; a(a==15)=2; a(a==9)=3; a(a==7)=4; ....

如果我有太多要更换的号码?

非常感谢!

4

2 回答 2

8

如果你真的想要一个“任意”替换,原始值和替换值之间没有直接关系,你可以使用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 版本早于'stable'unique` 的属性,那么

>> [~,~,a2] = unique(a)

a2 =

     1     1     4     4     3     3     2     2

这与您的替换相似,尽管这些数字指的是 中不同元素的排序列表中每个元素的索引a,而您的示例似乎使用了未排序的索引 - 尽管这可能只是您的示例的任意选择。

于 2013-11-06T12:21:07.577 回答
3

为此目的,内置了一个 MATLAB changem (Substitute values in data array)-Mapping Toolbox

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.

于 2015-11-16T08:30:25.660 回答