Come posso dividere ogni riga di una matrice per una riga fissa?

Supponiamo che io abbia una matrice come:

100 200 300 400 500 600 1 2 3 4 5 6 10 20 30 40 50 60 ... 

Desidero dividere ogni riga per la seconda riga (ogni elemento per l’elemento corrispondente), quindi otterrò:

 100 100 100 100 100 100 1 1 1 1 1 1 10 10 10 10 10 10 ... 

Posso farlo (senza scrivere un ciclo esplicito)?

Usa bsxfun :

 outMat = bsxfun (@rdivide, inMat, inMat(2,:)); 

Il primo argomento di bsxfun è un handle della funzione che si desidera applicare, in questo caso la divisione a destra.

Ecco un paio di modi equivalenti:

 M = [100 200 300 400 500 600 1 2 3 4 5 6 10 20 30 40 50 60]; %# BSXFUN MM = bsxfun(@rdivide, M, M(2,:)); %# REPMAT MM = M ./ repmat(M(2,:),size(M,1),1); %# repetition by multiplication MM = M ./ ( ones(size(M,1),1)*M(2,:) ); %# FOR-loop MM = zeros(size(M)); for i=1:size(M,1) MM(i,:) = M(i,:) ./ M(2,:); end 

La soluzione migliore è quella che utilizza BSXFUN (come pubblicato da @ Itamar Katz )

Ora puoi utilizzare le operazioni matrice vs matrice .

Questo farà il trucco:

 mat = [100 200 300 400 500 600 1 2 3 4 5 6 10 20 30 40 50 60]; result = mat ./ mat(2,:) 

che produrrà:

 result = 100 100 100 100 100 100 1 1 1 1 1 1 10 10 10 10 10 10 

Funzionerà in Octave e Matlab da R2016b.