2011-02-04 19 views
7

Ho una matrice A tale cheCome posso sostituire alcuni valori di colonna in base a una condizione?

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 

voglio fare due cose:

  1. Sostituire i valori della prima colonna che sono maggiori di 5 per 0.
  2. Nella seconda colonna, se i valori rientrano nell'intervallo 121-130, sostituirli con 0. Se sono compresi nell'intervallo 131-140, sostituisci con 1, 141-150 per 2, 151-160 per 3, ecc.

Quindi la matrice risultato desiderato sarebbe:

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 

Come posso fare questo?

Stavo cercando qualcosa di simile:

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 

Sarebbe utilizzando un caso fare il trucco?

+0

Che dire di un valore di bordo come 130? Sarebbe 0 o 1? – gnovice

+0

beh, ho dimenticato di dire, un margine sarebbe 0, 131-140 sarebbe 1, 141-150 2 – cMinor

risposta

11

È possibile modificare le prime 2 colonne di A modo:

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 

utilizza Quanto sopra matrix indexing e vectorized operations evitare per cicli o istruzioni case.

+0

Come funziona, potresti spiegare, Correggere il numero ... ma? – cMinor

+2

+1 per un uso intelligente di FIX. Se gli intervalli non sono equidistanti come sopra, probabilmente useresti HISTC – Amro

+1

@darkcminor: la funzione [FIX] (http://www.mathworks.com/help/techdoc/ref/fix.html) è equivalente a [FLOOR ] (http://www.mathworks.com/help/techdoc/ref/floor.html) per i numeri positivi e [CEIL] (http://www.mathworks.com/help/techdoc/ref/ceil.html) per i numeri negativi, quindi tutto è arrotondato verso lo zero. Se vuoi avere una migliore idea di cosa viene fatto ad ogni elemento della seconda colonna quando sottrai 121 e scala per 10, guarda cosa ottieni prima di applicare FIX: '(A (:, 2) -121) ./ 10' – gnovice

Problemi correlati