2016-08-03 13 views
1

Ich habe eine Funktion fun genannt, und ich brauche den folgenden Code auszuführen:Verunstetigen anonyme Funktion Matlab

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

Danach muss ich aus Proben der Funktion p

ich einen Vektor bauen ist wie diese tut es (n zuvor definiert):

v = 0:2*pi/n:2*pi; 
for i=1:n+1 
    samplesofp(i) = p(v(i)); 
end 

Ich mag würde wissen, ob es ein besserer Weg, dies zu tun, da ich es so schnell wie möglich laufen muss.

+0

Ich vermisse etwas, aber 'p' bekommt nur' theta' als Eingabe, woher kommt das 'r'? – EBH

+0

Es ist im Grunde eine Änderung der Variablen, von 'x, y '(kartesisch) in' Spaß 'zu' r, Theta' in 'polarfun' (Polarkoordinaten), dann integriere ich über' r' von '0' nach' Inf 'so' r' geht weg - –

+1

Probieren Sie 'samplesofp = arrayfun (p, v);'. Auch wie ist 'Spaß' definiert? Es kann relevant sein ... –

Antwort

1

Sie van entweder verwenden arrayfun, wie in den Kommentaren vorgeschlagen:

samplesofp = arrayfun(p,v); 

oder integral für ein Array Eingang:

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

die zweite Option ist wahrscheinlich schneller:

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)); 

die Zeit der ersten Option t = 0,05758 1 Sek. während die Zeit der zweiten Option ta = 0,010085 sek. Aber es kann auf fun, die ich hier erfunden habe, als eine sehr einfache Funktion abhängen.

+0

Danke, ich habe die zweite Option 'ta' benutzt. Grundsätzlich ist 'Spaß' ein Gaussian oder eine Kombination von Gaußverteilungen. –