次のコードをベクトル化したい:(fun
カスタム関数はどこにありますか)
m = zeros(R,C);
for r = 1:R
for c = 1:C
m(r,c) = fun(r,c);
end
end
どんな助けでもいただければ幸いです。
メッシュグリッドを使用する:
N = 100 % grid points
rangex=linspace(-2,2,N);
rangey=linspace(-2,2,N);
[x,y] = meshgrid(rangex,rangey);
%G=fun(x,y);
G= exp(-(x.^2+y.^2));
imagesc(G)
明確にするために、入力にベクトル(または行列)を受け入れない場合、一般的な「ベクトル化された」ソリューションはありません。fun
そうは言っても、私はnateの答えに追加し、fun
行列を受け入れない場合は、次の方法でこれを実行できると言います。
[Y, X] = meshgrid(1:R, 1:C);
m = arrayfun(@(r, c)fun(r, c), X, Y)
ただし、これは内部に-looparrayfun
があるようなベクトル化されたソリューションではないため、よりきれいな場合もありますが、おそらく低速であることに注意してください。for
これを行うにはいくつかの方法があります。
G = @(x,y) exp(-(x.*x+y.*y));
% using meshgrid
% PROS: short, very fast, works only on functions that accept vector/matrix input
% CONST: very large memory footprint
[x,y] = meshgrid(-10:0.1:10);
m = G(x,y);
% using arrayfun
% PROS: shorter notation than loop, works on functions taking only scalars
% CONS: can be prohibitively slow, especially when nested like this
m = cell2mat(...
arrayfun(@(x)...
arrayfun(@(y) G(x,y), -10:0.1:10),...
-10:0.1:10, 'uniformoutput', false));
% using for-loop
% PROS: intuitive to most programmers, works on functions taking scalars only
% CONS: Boilerplate can grow large, can be slow when the function G(x,y)
% is not "inlined" due to limitations in JIT
for ii = 1:R
for jj = 1:C
m(ii,jj) = exp(-(ii*ii+jj*jj)); % inlined
m(ii,jj) = G(ii,jj); % NOT inlined (slower)
end
end
meshgrid
はループよりもはるかに高速ですが、メモリがいっぱいになる可能性があるため、または範囲arrayfun
の高解像度にこの方法を使用することは不可能であることに注意してください(何らかのブロック処理スキームに頼ることなく)。x
y
ここで、これarrayfun
は一般的に避けるべきことです。これは、ループのJITアクセラレーションが原因で、また無名関数に関連するオーバーヘッドが原因で、ループカウンターパートよりもはるかに遅いことが多いためです(これでは、3重にネストされています)。場合)。
したがって、dblquad
コメントで言及した例では、ループを使用するだけが最も簡単で最速です。
いくつかのMatlab関数は、入力として行列を処理でき、出力として行列を提供します。しかし、楽しみがカスタムであれば、それでも簡単です!実際にfun
行列を入力として受け入れるようにすることができ(もちろん、何をしているかによって異なりますが、できない場合もありますが、ほとんどの場合はできます)、それは機能します。ほとんどの場合、行列または数値だけを受け入れることの違いは、(および他の演算子と同じように)置換*
することにあります。.*
試す:
m=[]; %not necesary in this case
r=1:R;
c=1:C;
m=fun(r,c);