2011-12-11 89 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)中,所以這會給出錯誤的結果。