2011-01-18 3 views
24

Iのような行列があるとします。私は2番目の行(対応する要素により、各要素)によって各列を分割したいので、私は取得します行列の各行を固定行でどのように分割できますか?

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

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

Hwとすることができるが私はそれを(明示的なループを書くことなく)行うのですか?

+0

同様の質問:[MATLABの列合計で行列要素を分割するにはどうすればいいですか?](0120-18753) – Amro

答えて

33

使用bsxfun

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

bsxfunへの第一引数には、このケースの右部門で、適用する関数のハンドルです。

26

はここでカップルより多くの同等の方法です:

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 

最善の解決策は、あなたが今array vs matrix operationsを使用することができます(@Itamar Katzによって投稿される)BSXFUNを使用して1

+0

(+1)ありがとう! –

3

です。

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

result = mat ./ mat(2,:) 

出力がされます:

result = 

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

これは、R2016b以降オクターブとMatlabの中で動作します

この

は、トリックを行います。

+1

実際にはMATLABでも動作します(http://stackoverflow.com/a/1773119/52738)。 – gnovice

+0

精度のおかげで、編集。 – Tom

関連する問題