【发布时间】: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