Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I replace some column values depending on a condition?

Tags:

matrix

matlab

I have a matrix A such that

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

I want to do two things:

  1. Replace the values of the first column that are greater than 5 by 0.
  2. In the second column, if the values are within the range 121-130, replace them by 0. If they are within the range 131-140, replace by 1, 141-150 by 2, 151-160 by 3, etc.

So the desired result matrix would be:

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

How can I accomplish this?

I was trying something like this:

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

Would using a case do the trick?

like image 844
edgarmtze Avatar asked Feb 04 '11 05:02

edgarmtze


1 Answers

You can modify the first 2 columns of A like so:

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

The above uses matrix indexing and vectorized operations to avoid for loops or case statements.

like image 158
gnovice Avatar answered Sep 27 '22 16:09

gnovice