2016-03-18 46 views
0

能否请你帮我以下的问题:我有以下功能手柄:操作在MATLAB功能句柄

r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data 

我想找到那个让我一个均值函数零的最优lambda表达式,用于该功能内的一组给定权力。我试图这样做,并没有工作,因为它返回我一个错误未定义操作符类型“function_handle”的输入参数是:

lambda0 = 0.3; 
for a = 2:10 %power coefficient 
S1(a) = fzero(mean((r - b)*r1.^(1/(a - 1))),lambda0); 
end 

任何建议至于怎样去了解这个问题是高度赞赏!先谢谢你。

回答

1

fzero接受函数句柄作为第一个输入。正如你现在所拥有的,你试图通过一个声明作为第一个输入。这个语句甚至无法正确评估,因为您正在尝试对函数句柄执行数字操作(稍后会详细介绍)。

你需要,而不是做这样的事情,我们创建一个新的功能手柄,用于评估功能处理和执行你所需要的其他操作。

S1(a) = fzero(@(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))),lambda0); 

另外说明

上的功能句柄执行操作是相同的结果执行它们。

因此,举例来说,如果我们有一个函数句柄:

func = @(x)2*x; 

如果我们评估这一点,通过与输入值调用它x

func(2) 

    4 

这工作,因为我们期望的那样。现在,如果我们真正想要的价值(2*x)^2,我们可以尝试把它写,你在你的问题

func2 = func^2; 

我们会得到一个错误写你的声明的方式!

Undefined operator '^' for input arguments of type 'function_handle'.

这不起作用,因为MATLAB试图将^操作适用于功能手柄本身,而不是评价功能的值处理

相反,我们需要创建一个功能手柄,基本上包装了另一个并执行任何附加选项:

func2 = @(x)func(x)^2; 
func2(2) 

    16 

把它全循环

因此,如果我们回去对于你的问题,你这样定义了你的匿名函数r1

r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data 

这一切看起来不错。您有一个输入参数,并从父工作区引用rb

现在当你调用fzero您尝试创建一个新的功能手柄的希望寄托在这个功能手柄进行操作。

mean((r - b)*r1.^(1/(a - 1))) 

就像我们刚刚出现,这将导致一个非常类似的错误

Undefined operator .^ for input arguments of type 'function_handle'

因此,我们需要包装成一个新的功能这一点。

newfunc = @(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))); 

现在我们可以安全地通过这fzero

result = fzero(newfunc, lambda0); 
+0

非常感谢你,它的工作! – Astrid

+1

谢谢您的额外解释,它真的帮助我了解手头问题背后的机制。 – Astrid

+0

我有一个后续问题:是否可以使用fzero来限制[0,1]中的lambdas的值? – Astrid