5

ループワールド(Cなど)からマトリックスワールドに入った

ベクトル/行列の個々のメンバーで関数を呼び出し、結果のベクトル/行列を返したいと思います。

これは私が現在それをしている方法です:

function retval = gauss(v, a, b, c)
  for i = 1:length(v)
    retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c)));
  endfor
endfunction

使用例:

octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);

さて、MATLAB / Octaveに関するすべてのアドバイスは、次のように述べています。ループを使用していることに気づいたら、やめて、それを行うためのより良い方法を考えてください。

したがって、私の質問:ベクトル/行列の各メンバーで関数を呼び出し、明示的なループを使用せずに、結果を新しいベクトル/行列に一度に返すことはできますか?

それは私がこのようなものを探しているということです:

 function retval = newfun(v)
    retval = 42*(v^23); 
endfunction

おそらく、それは単なる構文糖衣であり、それだけですが、それでも知っておくと便利です。

4

4 に答える 4

6

matlabでは「。」演算子のプレフィックスは要素ごとの操作です。

次のようなものを試してください。

function r = newfun(v)
 r = a.*exp(-(v-b).^2./(2*c^2))
end
于 2010-03-18T15:13:21.387 に答える
6

関数は次のようになります。

function retval = gauss(v, a, b, c)
  retval = a*exp(-(v-b).^2/(2*c^2));

コードをベクトル化してループを回避する方法については、MATLABのドキュメントを読むことをお勧めします。

コードベクトル化ガイド

パフォーマンスを改善するためのテクニック

また、ループを含むコードは、ベクトル化されたコードよりも明確になる場合があります。最近のJITコンパイラの導入により、MATLABはループを非常にうまく処理します。

于 2010-03-18T15:14:42.460 に答える
3

ARRAYFUN(およびその親戚)はそれを行う通常の方法です。

しかし、あなたの特定のケースでは、あなたはただすることができます

mycurve = a*exp(-(d-b).^2/(2*c^2));

糖衣構文だけではありません。ループを排除すると、コードの実行が大幅に高速化されます。

于 2010-03-18T15:17:53.910 に答える
1

はい。

function retval = newfun(v)
    retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction
于 2010-03-18T15:12:17.250 に答える