在一列中,值2替换为1,值为1& 3替换为2.我在下面写的代码有问题:
S=[1 1 1 2 2 3 3 3 3];
S(S==2)=1; S(S==1)=2; S(S==3)=2;
结果:
S=[2 2 2 2 2 2 2 2 2]
然而,我想得到的结果是S = [2 2 2 1 1 2 2 2 2]。有人可以帮忙吗?
答案 0 :(得分:4)
这种情况正在发生,因为在S(S==1)=2;
步骤中,您受到S(S==2)=1;
步骤的修改的影响。试试这个
S = [1 1 1 2 2 3 3 3 3];
S_copy = S;
S(S_copy == 2) = 1; S(S_copy == 1) = 2; S(S_copy == 3) = 2;
或者您也可以将测试结果保存到单独的变量中:
S = [1 1 1 2 2 3 3 3 3];
f1 = (S == 2);
f2 = (S == 1);
f3 = (S == 3);
S(f1) = 1; S(f2) = 2; S(f3) = 2;
答案 1 :(得分:0)
您可以使用额外的矩阵来定义从S中的输入值到输出值的“地图”,而不是手动替换每个值。
>> S = [1 1 1 2 2 3 3 3 3]; % input
>> M = [2 1 2]; % M[i] = j -> map value i to j
>> S = M(S) % compute output
S =
2 2 2 1 1 2 2 2 2
这个操作在Matlab中应该非常快。
请注意,只要S中的值可以解释为索引值(即它们是整数而不是太大),此方法就可以正常工作。
答案 2 :(得分:-1)
你越来越近但是一旦你将所有的2改为1就会出现问题。
在此声明之后
S(S==2)=1;
数组看起来像这样
S = [1 1 1 1 1 3 3 3 3];
在其他两个陈述之后S(S==1)=2; S(S==3)=2;
你的数组显然会有2个。
S(S==2)=1; S(S==1)=2; S(S==3)=2;
你可以这样做:
S(S==2)=-1; S(S==1)=2; S(S==3)=2;S(S==-1)=1;
即。在第一步中将所有2
更改为其他值(例如-1
),然后执行所需的转换,即S(S==-1)=1
;