【问题标题】:Replace values in matrix with other values用其他值替换矩阵中的值
【发布时间】:2012-08-14 12:12: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

我寻找的不是循环 I,而是:a(row_indx,col_indx) = -5,它不起作用。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

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

    a(a == 2) = -5
    

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

    a(isinf(a)) = -5

    一般情况是:

    Mat(boolMask) = val

    其中Mat 是您的矩阵,boolMask 是另一个logical 值矩阵,val 是分配值

    【讨论】:

    • @Andrey 您能否建议在使用 isinf 函数在矩阵中搜索无穷大时如何使用它?
    【解决方案2】:

    试试这个:

    a(a==2) = -5;
    

    稍微长一点的版本是

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • (PlusOne) 不错的解决方案,但值得一提的是它需要映射工具箱。
      【解决方案4】:

      这是来自 Mapping Toolbox 的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        相关资源
        最近更新 更多