3

Mいくつかの行列を考えてみましょう:

M = rand(1000, 2000);

次のコード例を検討してください。

A = zeros(size(M));
for row = 1:1000
    for col = 1:2000
        A(row, col) = M(row,col)*(row + col);
    end
end

ループAなしで行列を計算するには?for

関数はありarrayfunますが、現在の要素のインデックスを取得する方法がわかりません:

A = arrayfun(@(x)(x*(index(1) + index(2))), M); %// but how to get index???

おそらく他の解決策がありますか(余分なループはありません)?

4

3 に答える 3

3

次のような単純なことを実行して、表す行列を取得し、row+colそれを M で乗算することができます。

M = rand(1000, 2000);
rowPlusCol = bsxfun(@plus,(1:size(M,1)).',1:size(M,2));
A = M.*rowPlusCol;

私の経験からするbsxfunと、 は非常に強力な関数であり、実行時間を確実に節約できます。これはその完璧な例です。

于 2013-09-03T15:56:23.140 に答える
2

多様性のために、別の派手なワンライナーを誇る代替ソリューションを次に示します。

A = M .* hankel(2:size(M, 1) + 1, size(M, 1) + 1:sum(size(M)));
于 2013-09-03T16:14:34.897 に答える