2012-06-06 68 views
11

我可以在一個班輪中寫下以下內容嗎?Matlab列表理解

x = [1,3,5] 
res = zeros(1,size(x,2)); 
for i=1:size(x,2); 
    res(i) = foo(x(i); 
end; 

假設foo函數沒有按預期處理數組。在我的情況下,即使給出一個數組作爲參數,foo也會返回一個標量。

在Python中,例如,它應該是這樣的:

x = [1,3,5] 
res = [foo(y) for y in x] 

回答

10

arrayfun是你所需要的。例如:

res = arrayfun(@foo, x) 

foo由於總是返回一個標量,上述將工作和res也將是相同的尺寸x的向量。如果foo返回可變長度輸出,則必須在arrayfun的調用中將'UniformOutput'設置爲false0。輸出將是一個cell陣列。

+1

「@」做什麼? –

+1

@LucyBrennan它創建一個[函數句柄](http://www.mathworks.com/help/techdoc/matlab_prog/brfpxgt-1.html)。您可以閱讀該文檔頁面和相關鏈接瞭解更多信息 – abcd

+1

Thx。如果foo實際上需要兩個參數,並且我希望第二個參數在所有迭代中保持不變,那該怎麼辦? –

6

只需添加到@yoda的很好的答案,而不是使用UniformOutput,你也可以使用{}括號:

res = arrayfun(@(t){foo(t)}, x) 

而且,在某些場合,foo已經被量化。

x = 1:10; 
foo = @(t)(power(t,2)); 
res = foo(x); 
+0

你能否更詳細地解釋一下'foo = @(t)(power(t,2));'意味着什麼? –

+0

這個問題是如果我想要做一些像'{i^2 for i to N}'那樣的問題?但我不想爲'^ 2'定義一個函數,有沒有其他選擇? –