如何根据条件替换某些列值?

cMi*_*nor 7 matlab matrix

我有一个A这样的矩阵

A=
     4.0000  120.0000   92.0000         0         0   37.6000    0.1910   30.0000
    10.0000  168.0000   74.0000         0         0   38.0000    0.5370   34.0000
    10.0000  139.0000   80.0000         0         0   27.1000    1.4410   57.0000
     1.0000  139.0000   60.0000   23.0000  846.0000   30.1000    0.3980   59.0000
     5.0000  136.0000   72.0000   19.0000  175.0000   25.8000    0.5870   51.0000
     7.0000  121.0000         0         0         0   30.0000    0.4840   32.0000
Run Code Online (Sandbox Code Playgroud)

我想做两件事:

  1. 将第一列的值大于5替换为0.
  2. 在第二列中,如果值在121-130范围内,则将其替换为0.如果它们在131-140范围内,则替换为1,141-150乘2,151-160乘3等.

所以期望的结果矩阵将是:

A=
    4.0000   0.0000   92.0000         0         0   37.6000    0.1910   30.0000
    0.0000   4.0000   74.0000         0         0   38.0000    0.5370   34.0000
    0.0000   1.0000   80.0000         0         0   27.1000    1.4410   57.0000
    1.0000   1.0000   60.0000   23.0000  846.0000   30.1000    0.3980   59.0000
    5.0000   1.0000   72.0000   19.0000  175.0000   25.8000    0.5870   51.0000
    0.0000   0.0000         0         0         0   30.0000    0.4840   32.0000
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

我正在尝试这样的事情:

counter=1;
for i = 1: rows
    if A(i,1) > 5
        A(i ,1) = 0;
    end
    if A(i,2) > 120 &&  A(i,2) < 130
        A(i ,2) = 0;
    end
    counter = counter+1;
end
Run Code Online (Sandbox Code Playgroud)

使用案例会不会这样做?

gno*_*ice 11

您可以A像这样修改前两列:

A(A(:,1) > 5,1) = 0;             %# Set values in column 1 greater than 5 to 0
A(:,2) = fix((A(:,2)-121)./10);  %# If the values in column 2 are all 120 or
                                 %#   greater you can shift, scale, then round
                                 %#   them towards 0 to get the new values
Run Code Online (Sandbox Code Playgroud)

以上使用矩阵索引向量化操作来避免循环或case语句.

  • +1用于巧妙使用FIX.如果范围不是如上所述,您可能会使用HISTC (2认同)