MATLAB中的递归函数句柄
Posted
技术标签:
【中文标题】MATLAB中的递归函数句柄【英文标题】:recursive function handle in MATLAB 【发布时间】:2017-07-29 15:17:15 【问题描述】:假设如下:
u=[1 2 3];
W_in=[4 5 6]';
W=[1 2 3;4 5 6;7 8 9];
x=zeros(3,4); %initialization
x(:,1)=[1 2 3]';
我怎样才能创建一个函数句柄:
x(:,i)=@(gamma) (1-gamma)*x(:,i-1)+gamma*(W*x(:,i-1)+W_in*u(i-1))
其中gamma
是一个介于 0 和 1 之间的标量。
由于我不能使用双数组来存储函数句柄,所以我尝试使用元胞数组来存储循环中生成的函数句柄:
x=cell(1,4);
x1=[1 2 3]';
for i=2:4,
xi=@(gamma) (1-gamma)*xi-1+gamma*(W*xi-1+W_in*u(i-1))
end
如果我将 gamma 设置为 0.4 并尝试访问 x2(0.4),我会得到 [7.8 16 24.2]',这就是我想要的。但是,当我尝试访问 x3(0.4) 时,我收到一条错误消息,提示“未定义运算符 '*' for input arguments of type 'function_handle'。”
好的,那我修改函数句柄如下,
xi=@(gamma) (1-gamma)*xi-1(gamma)+gamma*(W*xi-1(gamma)+W_in*u(i-1))
这一次,当我尝试访问 x2(0.4) 时,我收到另一个错误消息“下标索引必须是正整数或逻辑值。”,这意味着不应将 0.4 用作索引。这里让我感到困惑的是,以前我可以做 X2(0.4),但这次 MATLAB 似乎对 xi(j) 的解释不同,这次 j 必须是整数,不能是小数。所以在这种情况下我不知道在哪里分配我的 gamma 值以及如何摆脱错误。
一般我最后需要一个函数句柄的原因是我会将最终的误差函数句柄,它只涉及伽马,放入遗传算法 ga() 或 MATLAB 中的其他优化内置函数中,并找到最优值为伽玛。
所以最后,当我最终拥有函数句柄 x 的单元数组时。 我可以的
errorFunction=@(gamma) sum(arrayfun(@(x_q,y_q) y_q-x_q1(gamma),x,y));
[gamma global_minimum]=ga(errorfunction,1);
得到我的最佳伽玛。
【问题讨论】:
\*
不是有效的语法。你这是什么意思?
请将您的代码格式化为code blocks。这样读是不可能的。
@LuisMendo \` was probably there to escape the
*` 以便文本不会呈现为斜体。
或类似的东西 ;)
@beaker 一定是这样,是的
【参考方案1】:
您还应该将参数传递给前面的函数,然后一切似乎都按您的预期工作:
u=[1 2 3];
W_in=[4 5 6]';
W=[1 2 3;4 5 6;7 8 9];
x=cell(1,4);
x1=@(gamma)[1 2 3]';
for i=2:4,
xi=@(gamma) (1-gamma)*xi-1(gamma)+gamma*(W*xi-1(gamma)+W_in*u(i-1))
end
如果你在xi-1(gamma)
中省略了(gamma)
,那么你试图将一个标量与一个函数句柄相乘,这显然是行不通的。如果你在x1
的定义中省略了@(gamma)
,那么你试图将x1
作为一个函数调用(在x2
中),但实际上Matlab 注意到它不是一个函数,而只是一个常数矩阵,所以它尝试使用(..)
作为索引,但由于它是一个浮点数(你说例如0.5
)它会产生关于索引的上述错误。
最后一点:使用这样的函数句柄虽然有效,但效果不佳:这很慢,尤其是在您有大量嵌套调用的情况下。否则你可以构建一个多项式,因为这只是在gamma
中构建一个多项式表达式,可以在here找到说明。
【讨论】:
查看 OP 问题的第 4 个代码块:参数似乎在那里井井有条,并且他们声称出现错误(我没有尝试过)。 我知道这样的 cmets 不应该在这里发布,但是很好的答案。我们已经为此工作了一整天。我想我在这里学到了一些东西。干杯。 +1 @AndrasDeak 但他们没有将它与x1=@(gamam)...
结合使用:)
啊哈!谢谢,我看不出他们做错了什么(我相当确定您的版本确实有效;)以上是关于MATLAB中的递归函数句柄的主要内容,如果未能解决你的问题,请参考以下文章
Matlab:如何在没有循环或内置函数的情况下递归地获取斐波那契序列中的第 N 个元素