2 つのベクトル a と b といくつかの関数 f があります。そのような種類の MATLAB で行列を定義するための (パフォーマンスの) 最良の方法は何ですか?
A(m,n) = f(a(m)*b(n)) / ( (f(a(m)) * f(b(n)) )
ネストされたループを使用しないことは可能ですか?
2 つのベクトル a と b といくつかの関数 f があります。そのような種類の MATLAB で行列を定義するための (パフォーマンスの) 最良の方法は何ですか?
A(m,n) = f(a(m)*b(n)) / ( (f(a(m)) * f(b(n)) )
ネストされたループを使用しないことは可能ですか?
今はコンピューターではありませんが、試してみてください
A=f(a*b')./(f(a)*f(b)')
ここで、a と b は列ベクトルです。a*b' は外積です。
f
ベクトル構文をサポートしている場合は、次のようになります。
[A,B] = meshgrid(a,b);
M = f(A.*B) ./ ( f(A).*f(B) );
ちなみに、通常のループよりもパフォーマンスが向上するかどうかはわかりません。より良いプロファイルとチェック。JIT の導入以来、Matlab ループはベクトル化された操作よりも高速に実行されることがよくあります。
以下に例を示します。
function CalcGrid()
a = 1:10;
b = 1:10;
[A,B] = meshgrid(a,b);
M = f(A.*B) ./ ( f(A).*f(B) );
figure;surf(M);
end
function y = f(x)
y = x-1;
end