将矩阵中的值替换为其他值

时间:2012-08-14 12:12:15

标签: matlab matrix

我有一个带整数的矩阵,我需要用-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,这不起作用。

4 个答案:

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

更多信息:http://www.mathworks.com/help/map/ref/changem.html

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