我在Simulink中有一个MATLAB功能块(在下面的视觉中命名为Q_learning) . 代码需要更新现有的矩阵(用'Q'表示),该矩阵最初在脚本(initialpara.m文件)中声明为7乘10 ^ 7的零矩阵 .
但它似乎无法访问矩阵的初始声明 . 错误消息如下:
未定义的函数或变量'Q' . 对局部变量的第一次赋值决定了它的类 . 功能'控制中心/ MATLAB功能'(#174.774.775),第32行,第21栏:“Q”启动诊断报告 .
initialpara.m file
%%% Q Learning Parameters %%%
Q = zeros(7,100*100*1000);
gamma = 0.8;
previous_state = 0;
previous_reward = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Q_learning.m file
function [KP, KI, KD, state, reward] = Qlearning(e_now, previous_state, previous_reward)
%#codegen
if (e_now >= -1 && e_now <= 1)
state = 1;
reward = 7;
elseif (e_now >= -5 && e_now <= 5)
state = 2;
reward = 6;
elseif (e_now >= -10 && e_now <= 10)
state = 3;
reward = 5;
elseif (e_now >= -15 && e_now <= 15)
state = 4;
reward = 4;
elseif (e_now >= -20 && e_now <= 20)
state = 5;
reward = 3;
elseif (e_now >= -25 && e_now <= 25)
state = 6;
reward = 2;
elseif (e_now >= -30 && e_now <= 30)
state = 7;
reward = 1;
end#
subMatrix = Q(state, :);
[maxQ_value, max_column] = max(subMatrix);
Q(state, previous_state) = previous_reward + 0.9 * maxQ_value;
[KP, KI, KD] = action_decode(max_column);
end
我试图在模型工作区中声明变量'Q'(尽管它已在基础工作区中声明)但它没有解决问题 .
任何人都可以帮我解决这个问题吗?谢谢!
2 回答
宣布Q全球 . 请参阅MATLAB中的
help global
.在这种情况下,您需要“声明”Q.您可以执行“编辑数据”选项,然后选择“添加数据” . 按照配置选项 . 另一种方法是在Simulink中定义信号并将其作为Matlab函数的参数 . 顺便说一下,将读取信号保持在左侧和右侧是一个很好的做法 . 这提高了很多可读性 .