24 Stimmen

Wie kann ich jede Zeile einer Matrix durch eine feste Zeile dividieren?

Angenommen, ich habe eine Matrix wie:

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

Ich möchte jede Zeile durch die zweite Zeile dividieren (jedes Element durch das entsprechende Element), also erhalte ich:

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

Wie kann ich das tun (ohne eine explizite Schleife zu schreiben)?

0 Stimmen

34voto

Itamar Katz Punkte 9454

Verwenden Sie bsxfun :

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

Das 1. Argument für bsxfun ist ein Handle zu der Funktion, die Sie anwenden wollen, in diesem Fall Rechts-Division.

27voto

Amro Punkte 122495

Hier ein paar weitere gleichwertige Möglichkeiten:

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

Die beste Lösung ist diejenige, die BSXFUN verwendet (wie von @Itamar Katz )

6voto

Tom Punkte 355

Sie können nun Folgendes verwenden Array- und Matrixoperationen .

So geht's:

mat = [100 200 300 400 500 600
     1   2   3   4   5   6
     10  20  30  40  50  60];

result = mat ./ mat(2,:)

was zur Ausgabe von :

result =

   100   100   100   100   100   100
     1     1     1     1     1     1
    10    10    10    10    10    10

Dies funktioniert in Octave und Matlab seit R2016b.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X