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

时间:2011-02-04 05:31:42

标签: 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

我想做两件事:

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

    我该如何做到这一点?

    我正在尝试这样的事情:

    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
    

    使用案例会不会这样做?

1 个答案:

答案 0 :(得分: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

以上使用matrix indexingvectorized operations来避免for循环或case语句。

相关问题