我有一个带整数的矩阵,我需要用-5替换2的所有外观。最有效的方法是什么?我按照下面的方式制作,但我确信有更优雅的方式。
a=[1,2,3;1,3,5;2,2,2]
ind_plain = find(a == 2)
[row_indx col_indx] = ind2sub(size(a), ind_plain)
for el_id=1:length(row_indx)
a(row_indx(el_id),col_indx(el_id)) = -5;
end
而不是循环我寻找类似的东西:a(row_indx,col_indx)= -5,这不起作用。
答案 0 :(得分:25)
find
。
改为使用逻辑索引:
a(a == 2) = -5
如果搜索矩阵是否等于inf
,您应该使用
a(isinf(a)) = -5
一般情况是:
Mat(boolMask) = val
其中Mat
是您的矩阵,boolMask
是另一个logical
值矩阵,val
是赋值
答案 1 :(得分:13)
试试这个:
a(a==2) = -5;
稍长的版本将是
ind_plain = find(a == 2);
a(ind_plain) = -5;
换句话说,您可以使用线性索引直接索引矩阵,无需使用ind2sub
转换它们 - 非常有用!但如上所示,如果使用布尔矩阵索引矩阵,则可以更短。
顺便说一句,你应该在你的陈述之后加分号,如果(通常是这种情况)你不想把语句的结果转出到控制台。
答案 2 :(得分:1)
如果要改变向量中的值,Martin B的方法很好。但是,要在矩阵中使用它,您需要获得线性索引。
我找到的最简单的解决方案是使用changem
函数。非常好用:
mapout = changem(Z,newcode,oldcode)
在您的情况下:newA = changem(a, 5, -2)
答案 3 :(得分:0)
这是映射工具箱中changem
的一个微不足道的,未经优化的,可能很慢的实现。
function mapout = changem(Z, newcode, oldcode)
% Idential to the Mapping Toolbox's changem
% Note the weird order: newcode, oldcode. I left it unchanged from Matlab.
if numel(newcode) ~= numel(oldcode)
error('newcode and oldcode must be equal length');
end
mapout = Z;
for ii = 1:numel(oldcode)
mapout(Z == oldcode(ii)) = newcode(ii);
end
end