これをベクトル化できません:
for x=2:i
for y=2:j
if(x ~= y)
Savings(x,y) = Costs(x,1) + Costs(1,y) - Costs(x,y);
end
end
end
このコードのパフォーマンスを改善できると教えてもらえますか? ありがとう
これをベクトル化できません:
for x=2:i
for y=2:j
if(x ~= y)
Savings(x,y) = Costs(x,1) + Costs(1,y) - Costs(x,y);
end
end
end
このコードのパフォーマンスを改善できると教えてもらえますか? ありがとう
このようにベクトル化できますが、それがパフォーマンスに影響するかどうかはわかりません。自分でテストする必要があります。
m=size(Costs, 1);
n=size(Costs, 2);
[Y, X] = meshgrid(2:m, 2:n);
Cx = Costs(:,1);
Cy = Costs(1,:);
S = Cx(X) + Cy(Y) - Costs(2:end,2:end);
S(eye(m-1,n-1)==1) = 0;
Savings = zeros(m,n);
Savings(2:end,2:end) = S;
編集
ちなみに、3つの方法すべてで同じ答えが得られることを確認しました。サイズが 400x400 の場合Costs
、実行時間は次のとおりです。
Elapsed time is 0.00741386 seconds. //My method
Elapsed time is 0.003304 seconds. //Mohsen's method (after correcting to prevent errors)
Elapsed time is 2.16231 seconds. //Original Loop
したがって、両方の方法で大幅な向上が得られます。ただし、ループを事前に割り当てるだけSavings
では、実際には最速です。これは本当にあなたの目的には遅すぎますか?
からの助けを借りてbsxfun
:
Ix=2:i;
Iy=2:j;
I = false(i,j);
I(Ix,Iy) = bsxfun(@ne, Ix', Iy);
S = bsxfun(@plus, Costs(Ix,1), Costs(1,Iy)) - Costs(Ix,Iy);
Savings(I) = S(I(Ix,Iy));