14

我有一个整数矩阵,我需要用 -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

而不是循环 II 寻找类似的东西:a(row_indx,col_indx) = -5,这不起作用。

4

4 回答 4

28

find在这种情况下不需要。改为使用逻辑索引:

a(a == 2) = -5

如果搜索矩阵是否等于inf您应该使用

a(isinf(a)) = -5

一般情况是:

Mat(boolMask) = val

Mat您的矩阵在哪里 ,boolMask是另一个logical值矩阵,并且val是分配值

于 2012-08-14T12:15:12.917 回答
13

尝试这个:

a(a==2) = -5;

稍长的版本将是

ind_plain = find(a == 2);
a(ind_plain) = -5;

换句话说,您可以直接使用线性索引来索引矩阵,而无需使用ind2sub--非常有用!但如上所示,如果使用布尔矩阵索引矩阵,则可以变得更短。

顺便说一句,如果(通常情况下)您对将语句的结果转储到控制台不感兴趣,则应该在语句后放置分号。

于 2012-08-14T12:15:36.440 回答
1

如果您要更改向量中的值,Martin B 的方法很好。但是,要在矩阵中使用它,您需要获得线性索引。

我找到的最简单的解决方案是使用changem函数。非常容易使用:

mapout = changem(Z,newcode,oldcode) 在你的情况下:newA = changem(a, 5, -2)

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

于 2014-05-25T14:22:38.417 回答
0

changem这是 Mapping Toolbox中一个简单的、未优化的、可能很慢的实现。

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
于 2015-01-26T10:18:26.283 回答