次のような行列があるとします。
100 200 300 400 500 600
1 2 3 4 5 6
10 20 30 40 50 60
...
各行を2行目(各要素を対応する要素で除算)で除算したいので、以下を取得します。
100 100 100 100 100 100
1 1 1 1 1 1
10 10 10 10 10 10
...
Hwは(明示的なループを書かずに)できますか?
bsxfun
を使用:
outMat = bsxfun (@rdivide, inMat, inMat(2,:));
bsxfun
の最初の引数は、適用する関数(この場合は右除算)のハンドルです。
次に、同等の方法をいくつか示します。
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
最良の解決策は、BSXFUNを使用するものです( @ Itamar Katz により投稿)。
配列vs行列演算 を使用できるようになりました。
これはトリックを行います:
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以降、OctaveおよびMatlabで機能します。