2011-12-11 50 views
2

我需要编写我自己的函数,它的格式为f(x,y)=Integrate(g(x,y,z),z from 0 to inf)。所以我使用的代码是:matlab函数是一个整数函数

function y=f(x,y) 
[email protected](z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z 
y=quadgk(g,0,inf) 

,如果我把它像f(x0,y0)一个值,它的工作原理,但如果我尝试计算像f([1:10],y0)的东西,那么错误消息说,有什么不对的时间和维度。原则上,我可以使用for循环,但随后我的代码变慢并且需要永久使用。我能从你们那里得到什么帮助吗?或参考?

我试图避免for循环,因为在matlab中使用矩阵计算要比使用for循环快得多。我想知道是否有任何技巧可以利用此功能。

感谢提前任何帮助,

林恩

+0

就你而言,我认为你应该使用for循环。如果你有'x = 1:10',我想它不会超过正常函数的十倍。 – Oli

+0

好吧,如果我为循环做了10次这不是问题,但是我需要将这个函数传递给另一个函数来做一些优化,为了做到这一点,函数f必须能够接受向量输入并生成向量输出... – user1092696

回答

0

或许你可以尝试调换的间隔,创建基于f([1:10]',y0)基于行的值,而不是列。否则,函数中的某些内容可能是错误的,例如,要使x^y与列表一起作为输入使用,则必须以点x.^y作为前缀。同为mulitply和除法我想..

+0

非常感谢你的回答,我尝试了行和列向量,并且确保我在每个*和^和/后加上一个点,我应该包含我写下的确切函数。 – user1092696

0

如果循环是没有你的问题,你应该这样做:

function y2=f(x,y) 
y2=zeros(size(x)); 

for n=1:numel(x) 
    [email protected](z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z 
    y2(n)=quadgk(g,0,inf) 
end 
+0

非常感谢您的回复,并且我尝试了for循环,但是这需要永久运行我的整个代码。这个功能只是我的项目的一部分。在我定义这个函数之后,我需要对它执行拉普拉斯逆函数,然后使得到的函数最大化......所以如果我每次使用for循环的代码太慢,因为对于matlab,执行矩阵计算要快得多比for循环,只是希望有一些技巧来做到这一点。无论如何,非常感谢。 – user1092696

0

这里的问题是,quadk本身使用向量作为论据g。那么你有g这样的想法z.^x,这是两个向量的幂,只有当z和x具有相同的维数时才被定义。但这不是你想要的。

我假设您想要评估x中所有参数的函数,并且输出向量具有与x相同的尺寸。但是,这似乎并不可能,因为即使这个简单的例子

[email protected](x)[x;x.^2] 
quad(g,0,1) 

不起作用:使用quadgk

Error using quad (line 79) 
The integrand function must return an output vector of the same length as the 
input vector. 

类似的错误显示。该文件还说,这个例程只适用于标量函数,这并不奇怪,因为自适应正交规则通常会使用每个函数的不同点来评估积分。您可以使用quadv来代替矢量值函数。但是由于你的函数被集成在区间[0,\ infty)中,所以这会给出错误的结果。