假设如下:
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之间的标量。
由于我不能使用double数组来存储函数句柄,所以我尝试使用单元格数组来存储循环中生成的函数句柄:
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)时,我得到一个错误,对于'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);
获得最佳伽玛值。
答案 0 :(得分:3)
您还应该将参数传递给之前的函数,然后一切似乎都按预期工作:
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
如果省略(gamma)
中的x{i-1}(gamma)
,那么您试图将标量与函数句柄相乘,这显然不起作用。如果您在@(gamma)
的定义中省略x{1}
,那么您尝试将x{1}
作为函数调用(在x{2}
中),但实际上Matlab会注意到它它不是一个函数,而只是一个常量矩阵,所以它尝试使用(..)
作为索引,但由于它是一个浮点数(你说例如0.5
),它将产生关于索引的所述错误。
正如最后一点:使用这样的函数句柄,但不是很好:它很慢,特别是如果你有大量的嵌套调用。否则你可以构建一个多项式,因为这只是在gamma
中构造一个多项式表达式,可以找到指令here。