2012-09-01 45 views
2

我一定錯過了一件非常簡單的事情,因爲這看起來不應該這麼難。爲什麼不能在MATLAB匿名函數中定義一個變量?

此代碼是正確的:

clear all 
whatever = @(x) deal(max(x), size(x)); 
input = randn(1,1000); 
[a b] = whatever(input) 

不過,我真正想做的事情是這樣的:

clear all 
whatever = @(x) deal(q = 3; q*max(x), size(x)); 
input = randn(1,1000); 
[a b] = whatever(input)  

爲什麼這會打破?我不能在函數內定義q?我想要使​​用匿名函數的全部原因是我可以在其中執行多行代碼,然後返回答案。我假設匿名函數的最後一個語句是返回的,但是如何在其中定義變量?我不想在匿名函數的定義之前定義q。

謝謝。

+0

您不能。什麼阻止你做'@(x)交易(3 * max(x),size(x))'? –

+0

@EitanT我可以做到這一點。我問的原因是因爲我想讓q成爲some_very_complicated_function,所以它將成爲一個佔位符,以便代碼在最後可讀。我的印象是,我可以像實際功能一樣編寫匿名函數。它爲人類的可讀性。 – Spacey

回答

4

不能匿名函數內聲明的變量,因爲它必須從表達來構建,handle = @(arglist)expr

如果你想可讀性,定義q之外的功能,如:

q = 3; 
whatever = @(x) deal(q * max(x), size(x)); 
+0

呃,我想是吧。 : -/ – Spacey

1

我很確定交易不能採取多個命令。當然有多個參數,但你正在嘗試傳遞命令。這會工作嗎?

whatever = @(x) q=3; deal(q*max(x), size(x)); 

另外,你爲什麼不只是有這個?

whatever = @(x) deal(3*max(x), size(x)); 

如果你要在函數中定義它,你可能也只是把實際價值在那裏,如果你不能讓別的工作。

+0

_「這會工作嗎?」_ - 你問或回答?順便說一句,答案是:它不會工作。 –

+0

Camdroid,請看上面我對@EitanT的評論。它爲未來的人類可讀性。 – Spacey

2

你不知道。匿名函數只有一個聲明。你可以使用子函數(不是嵌套函數,這些是具有奇怪範圍規則的病態事物)。

function whatever = not_anonymous (x) 
    % your code here 
end 

如果您需要傳遞函數句柄,則可以使用@not_anonymous

+0

Hurray嵌套函數! :p –

2

您認爲以下結構如何:

tmpfun = @(x,q) deal... 
whatever = @(x) tmpfun(x,3) 
+0

這個想法確實發生在我腦海中,是的... – Spacey

相關問題