2011-01-18 6 views
24

Supposons que j'ai une matrice comme:Comment puis-je diviser chaque ligne d'une matrice par une ligne fixe?

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

Je souhaite diviser chaque ligne par la deuxième rangée (chaque élément par l'élément correspondant), donc je vais:

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

Hw peut Je le fais (sans écrire une boucle explicite)?

+0

Question similaire: [Comment est-ce que je divise des éléments de matrice par des sommes de colonne dans MATLAB?] (Http://stackoverflow.com/q/1773099/97160) – Amro

Répondre

33

Utilisation bsxfun:

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

Le 1er argument bsxfun est une poignée à la fonction que vous souhaitez appliquer, dans ce cas droit division.

26

est ici quelques autres façons équivalentes:

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 meilleure solution est celle qui utilise BSXFUN (telle que publiée par @Itamar Katz)

+0

(+1) Merci! –

3

Vous pouvez maintenant utiliser array vs matrix operations.

Cela fera l'affaire:

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

result = mat ./ mat(2,:) 

qui sera sortie:

result = 

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

Cela fonctionne dans Octave et Matlab depuis R2016b.

+1

Cela fonctionne réellement dans MATLAB maintenant [aussi] (http://stackoverflow.com/a/1773119/52738). – gnovice

+0

Merci pour la précision, édité. – Tom

Questions connexes