2016-08-03 5 views
1

私はfunと呼ばれる機能を持っている、と私は、次のコードを実行する必要があります:私は機能p離散化無名関数MathWorks社のMATLAB

Iのサンプルからなるベクトルを構築する必要があります。この後

polarfun = @(r,theta) fun(r.*cos(theta),r.*sin(theta)).*r; 
p = @(theta) integral(@(r)polarfun(r,theta),0,Inf); 

を(nが以前に定義されている)、このようにそれをやって「メートル:

v = 0:2*pi/n:2*pi; 
for i=1:n+1 
    samplesofp(i) = p(v(i)); 
end 
私はより良い方法があるかどうかを知りたい

私はできるだけ早く実行する必要があるので、これを行う。

+0

私は何かが見つからないかもしれませんが、 'p'は入力として' theta 'しか得ていません。 'r'はどこから来ますか? – EBH

+0

基本的には、変数funの 'x、y'(デカルト)から' polarfun'(極座標)の 'r、theta 'に変わり、' 0'から 'Inf '' r'は消える - –

+1

'samplesofp = arrayfun(p、v);'を試してください。 'fun'はどのように定義されていますか?関連性があるかもしれません... –

答えて

1

あなたのバンのいずれかのコメントで示唆したように、arrayfunを使用します。

samplesofp = arrayfun(p,v); 

をまたは配列入力用integral設定:

p = @(theta) integral(@(r)polarfun(r,theta),0,Inf,'ArrayValued',true); 
samplesofp = p(v); 

2番目のオプションは、より速く、おそらくです:

fun = @(x,y) x+y; 
polarfun = @(r,theta) fun(r.*cos(theta),r.*sin(theta)).*r; 
p = @(theta) integral(@(r)polarfun(r,theta),0,Inf); 
pa = @(theta) integral(@(r)polarfun(r,theta),0,Inf,'ArrayValued',true); 
n = 5; 
v = (0:2*pi/n:2*pi).'; 

t = timeit(@() arrayfun(p,v)); 
ta = timeit(@() pa(v)); 

最初のオプションの時刻t = 0.05758 1秒。第2のオプションの時間はta = 0.010085秒である。しかし、それはfunに依存している可能性がありますが、私はこれを非常に単純な関数として考案しました。

+0

ありがとう、私は2番目のオプション 'ta'を使いました。基本的に「楽しい」は、ガウス分布またはガウス分布の組み合わせです。 –