如何在Matlab中替换向量中的多个元素?

时间:2013-11-06 12:07:09

标签: matlab vector replace element

例如

我有一个矢量:

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; ....

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

非常感谢!

2 个答案:

答案 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