【问题标题】:recursive function handle in MATLABMATLAB中的递归函数句柄
【发布时间】: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);
x{1}=[1 2 3]';
for i=2:4,
    x{i}=@(gamma) (1-gamma)*x{i-1}+gamma*(W*x{i-1}+W_in*u(i-1)) 
end

如果我将 gamma 设置为 0.4 并尝试访问 x{2}(0.4),我会得到 [7.8 16 24.2]',这就是我想要的。但是,当我尝试访问 x{3}(0.4) 时,我收到一条错误消息,提示“未定义运算符 '*' for input arguments of type 'function_handle'。”

好的,那我修改函数句柄如下,

x{i}=@(gamma) (1-gamma)*x{i-1}(gamma)+gamma*(W*x{i-1}(gamma)+W_in*u(i-1)) 

这一次,当我尝试访问 x{2}(0.4) 时,我收到另一个错误消息“下标索引必须是正整数或逻辑值。”,这意味着不应将 0.4 用作索引。这里让我感到困惑的是,以前我可以做 X{2}(0.4),但这次 MATLAB 似乎对 x{i}(j) 的解释不同,这次 j 必须是整数,不能是小数。所以在这种情况下我不知道在哪里分配我的 gamma 值以及如何摆脱错误。

一般我最后需要一个函数句柄的原因是我会将最终的误差函数句柄,它只涉及伽马,放入遗传算法 ga() 或 MATLAB 中的其他优化内置函数中,并找到最优值为伽玛。

所以最后,当我最终拥有函数句柄 x 的单元数组时。 我可以的

errorFunction=@(gamma) sum(arrayfun(@(x_q,y_q) y_q-x_q{1}(gamma),x,y));
[gamma global_minimum]=ga(errorfunction,1);

得到我的最佳伽玛。

【问题讨论】:

  • \* 不是有效的语法。你这是什么意思?
  • 请将您的代码格式化为code blocks。这样读是不可能的。
  • @LuisMendo \` was probably there to escape the *` 以便文本不会呈现为斜体。
  • 或类似的东西 ;)
  • @beaker 一定是这样,是的

标签: matlab function function-handle


【解决方案1】:

您还应该将参数传递给前面的函数,然后一切似乎都按您的预期工作:

u=[1 2 3];
W_in=[4 5 6]';
W=[1 2 3;4 5 6;7 8 9];
x=cell(1,4);
x{1}=@(gamma)[1 2 3]';
for i=2:4,
    x{i}=@(gamma) (1-gamma)*x{i-1}(gamma)+gamma*(W*x{i-1}(gamma)+W_in*u(i-1)) 
end

如果你在x{i-1}(gamma) 中省略了(gamma),那么你试图将一个标量与一个函数句柄相乘,这显然是行不通的。如果你在x{1} 的定义中省略了@(gamma),那么你试图将x{1} 作为一个函数调用(在x{2} 中),但实际上Matlab 注意到它不是一个函数,而只是一个常数矩阵,所以它尝试使用(..)作为索引,但由于它是一个浮点数(你说例如0.5)它会产生关于索引的上述错误。

最后一点:使用这样的函数句柄虽然有效,但效果不佳:这很慢,尤其是在您有大量嵌套调用的情况下。否则你可以构建一个多项式,因为这只是在gamma中构建一个多项式表达式,可以在here找到说明。

【讨论】:

  • 查看 OP 问题的第 4 个代码块:参数似乎在那里井井有条,并且他们声称出现错误(我没有尝试过)。
  • 我知道这样的 cmets 不应该在这里发布,但是很好的答案。我们已经为此工作了一整天。我想我在这里学到了一些东西。干杯。 +1
  • @AndrasDeak 但他们没有将它与x{1}=@(gamam)... 结合使用:)
  • 啊哈!谢谢,我看不出他们做错了什么(我相当确定您的版本确实有效;)
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多