2017-09-10 136 views
1

我试图写一个简单的匿名函数返回一个数组匿名函数返回一个数组的长度更新 - MATLAB

>> a=[1 2 3]; 

>> f = @() length(a); 

>> f() 
    3 

>> a = [1 2 3 4]; 

>> f() 
    3 

的长度是否可以写一个返回的长度的函数每次调用它时更新的数组?

+2

有没有理由不希望'a'作为参数传入? – jodag

+1

您只需在函数中调用'length',那么为什么不使用'length'呢?如果你需要一个函数句柄,使用'f = @length;'。 – gnovice

+1

您是否阅读过[文档的这一部分](https://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html#f4-71621)? – gnovice

回答

3

丑陋的方法来完成你想要什么

global a; 
a = [1 2 3]; 
f = @() eval('global a; length(a)') 
f() 
a = [1 2 3 4]; 
f() 

我不得不说,我强烈反对这种类型的代码,因为它依赖于两个全局,并呼吁eval,这两者应该是尽可能避免。

一个更好的方法是在a以作为参数传递给函数

a = [1 2 3]; 
f = @(x) length(x) 
f(a) 
a = [1 2 3 4]; 
f(a) 

,或者因为在这种情况下调用f是相同的调用length,那么就实在没有理由使用匿名函数在所有。

a = [1 2 3]; 
length(a) 
a = [1 2 3 4]; 
length(a) 
+4

真的不值得一提丑陋的'eval'方法,它只会鼓励不好的练习,**可以避免时不要使用'eval' **!定义函数以接受参数是正确的答案,除了解释为什么之前失败(因为'a'在'f'内是'静态的',当'f'是用'a'定义的时候)是静态的。 – Wolfie

+1

它取决于约束的问题。如果'a'不能作为参数,那么使用'eval'可能是不可避免的。如果传递'a'作为参数是可能的,那么不应该使用'eval'。 – jodag

+1

如果'a'不能成为一个参数(特别是在这个简单的东西中),那么你的代码就糟透了。 – Wolfie

3

根据变量定义匿名函数使该变量在函数内保持静态。即

% this... 
a = [1 2 3]; 
f = @() length(a); 
% ... is equivalent to this... 
f = @() length([1 2 3]); 

你想创建可以带参数

f = @(x) length(x); 
a = [1 2 3]; 
f(a); % >> ans = 3 
a = [1 2 3 4]; 
f(a); % >> ans = 4 

虽然在这一点上,只要使用length(a)并没有定义一些指针的函数匿名函数!