2011-02-04 18 views
7

tengo una matriz A tales que¿Cómo puedo reemplazar algunos valores de columna dependiendo de una condición?

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 

quiero hacer dos cosas:

  1. reemplazar los valores de la primera columna que son mayores que 5 por 0.
  2. En el segundo columna, si los valores están dentro del rango 121-130, reemplácelos por 0. Si están dentro del rango 131-140, reemplace por 1, 141-150 por 2, 151-160 por 3, etc.

Así la matriz resultado deseado sería:

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 

¿Cómo puedo lograr esto?

yo estaba tratando algo como esto:

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 usando un caso hace el truco?

+0

¿Qué tal un valor de borde como 130? ¿Sería eso 0 o 1? – gnovice

+0

, se olvidó de decir, un borde sería 0, 131-140 sería 1, 141-150 2 – cMinor

Respuesta

11

puede modificar las 2 primeras columnas de A así:

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 

los usos anteriores matrix indexing y vectorized operations para evitar los bucles o declaraciones de casos.

+0

¿Cómo funciona eso, podría explicar, Fix redondea el número ... pero? – cMinor

+2

+1 para un uso inteligente de FIX. Si los rangos no están equiespaciados como en el caso anterior, probablemente use HISTC – Amro

+1

@darkcminor: La función [FIX] (http://www.mathworks.com/help/techdoc/ref/fix.html) es equivalente a [FLOOR ] (http://www.mathworks.com/help/techdoc/ref/floor.html) para números positivos y [CEIL] (http://www.mathworks.com/help/techdoc/ref/ceil.html) para números negativos, entonces todo se redondea hacia cero. Si desea obtener una mejor idea de lo que se hace a cada elemento de la segunda columna cuando resta 121 y escala por 10, observe lo que obtiene antes de aplicar FIX: '(A (:, 2) -121) ./ 10' – gnovice

Cuestiones relacionadas