0

次のコードをベクトル化したい:(funカスタム関数はどこにありますか)

m = zeros(R,C);
for r = 1:R
    for c = 1:C
        m(r,c) = fun(r,c);
    end
end

どんな助けでもいただければ幸いです。

4

4 に答える 4

2

メッシュグリッドを使用する:

 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)
于 2012-10-30T08:14:27.217 に答える
2

明確にするために、入力にベクトル(または行列)を受け入れない場合、一般的な「ベクトル化された」ソリューションはありません。fun

そうは言っても、私はnateの答えに追加し、fun行列を受け入れない場合は、次の方法でこれを実行できると言います。

[Y, X] = meshgrid(1:R, 1:C);
m = arrayfun(@(r, c)fun(r, c), X, Y)

ただし、これは内部に-looparrayfunがあるようなベクトル化されたソリューションではないため、よりきれいな場合もありますが、おそらく低速であることに注意してください。for

于 2012-10-30T10:01:45.200 に答える
1

これを行うにはいくつかの方法があります。

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の高解像度にこの方法を使用することは不可能であることに注意してください(何らかのブロック処理スキームに頼ることなく)。xy

ここで、これarrayfunは一般的に避けるべきことです。これは、ループのJITアクセラレーションが原因で、また無名関数に関連するオーバーヘッドが原因で、ループカウンターパートよりもはるかに遅いことが多いためです(これでは、3重にネストされています)。場合)。

したがって、dblquadコメントで言及した例では、ループを使用するだけが最も簡単で最速です。

于 2012-10-30T10:19:22.583 に答える
0

いくつかのMatlab関数は、入力として行列を処理でき、出力として行列を提供します。しかし、楽しみがカスタムであれば、それでも簡単です!実際にfun行列を入力として受け入れるようにすることができ(もちろん、何をしているかによって異なりますが、できない場合もありますが、ほとんどの場合はできます)、それは機能します。ほとんどの場合、行列または数値だけを受け入れることの違いは、(および他の演算子と同じように)置換*することにあります。.*試す:

m=[]; %not necesary in this case
r=1:R;
c=1:C;
m=fun(r,c);
于 2012-10-30T08:14:17.007 に答える