2014-09-28 6 views
9

Come iterare su ogni riga Z dove Z è un 2 * m matrice:iterare su ogni riga della matrice ottava

6.1101,17.592 
5.5277,9.1302 
8.5186,13.662 

Come si accede ogni Z (i) (j) all'interno di questo ciclo?

Ad esempio:

for i = z 
    fprintf('Iterating over row: '+ i); 
    disp (i:1); 
    disp (i:2); 
end 

visualizzerà:

Iterating over row: 1 
6.1101 
17.592 
Iterating over row: 2 
5.5277 
9.1302 
Iterating over row: 3 
8.5186 
13.662 

risposta

13

Se si utilizza for i = z quando z è una matrice, allora i assume il valore della prima colonna di z (6,1101; 5,5277; 8.5186), quindi la seconda colonna e così via. Vedere octave manual: The-for-Statement

Se volete iterare su tutti gli elementi si potrebbe usare

z = [6.1101,17.592;5.5277,9.1302;8.5186,13.662] 

for i = 1:rows(z) 
    for j = 1:columns(z) 
    printf("z(%d,%d) = %f\n", i, j, z(i,j)); 
    endfor 
endfor 

quali uscite:

z(1,1) = 6.110100 
z(1,2) = 17.592000 
z(2,1) = 5.527700 
z(2,2) = 9.130200 
z(3,1) = 8.518600 
z(3,2) = 13.662000 

Ma tenere a mente che per i cicli sono lenti in ottava quindi può essere desiderabile usare un metodo vettorializzato. Molte funzioni utilizzano l'input amtrix per i calcoli più comuni.

Per esempio, se si vuole calcolare la somma complessiva:

octave> sum (z(:)) 
ans = 60.541 

o la differenza tra di file adiacenti:

octave> diff (z) 
ans = 

    -0.58240 -8.46180 
    2.99090 4.53180 
+0

Proveniente da un forte background JavaScript l'idea di metodi vettorizzati mi sembra estranea. Se il mio obiettivo era calcolare la somma di tutte le iterazioni * m * di * X * dove ogni aritmetica di iterazione viene eseguita su * X (i, j) * quale sarebbe un esempio di questo aspetto se non ci fossero cicli per? –

+1

Se si desidera calcolare la somma di tutti gli elementi di z, è possibile utilizzare "sum (z (:))". Puoi anche usare "somma" (è una funzione di ottava) per calcolare la somma di righe o colonne. Vedi "aiuto somma" e l'argomento DIM. Octave è stato progettato per funzionare su matrici quindi è davvero, davvero improbabile che sia necessario eseguire il loop su un vettore o una matrice. – Andy

+0

Questa risposta è così vicina che mi sono davvero confuso quando non ha funzionato. Come indicato nel manuale che colleghi, perché non scorre sulle righe di una matrice ma sulle colonne. Dovresti trasporre per ottenere l'effetto desiderato. – Tim

0

È possibile trasporre la matrice prima e poi fare per dichiarazione in questo modo :

for i = z' 
    disp(i(1)) 
    disp(i(2)) 
end 

Anche se in questo caso non si avrà un indice affermando quale riga si è using