MATLAB R2022b自动电压调节器ANN训练代码报错修复求助
修复MATLAB R2022b中ANN训练代码的minmax报错问题
错误原因
报错Error using minmax: Data is not a matrix or cell array的核心原因是:从Simulink输出的out.input转置后得到的I并非minmax函数要求的二维数值矩阵或cell数组,大概率是Simulink仿真输出的结构体、SimulationOutput对象或其他非数值矩阵类型。
修复步骤
1. 提取Simulink输出中的数值数据
Simulink的仿真输出out通常是Simulink.SimulationOutput对象,输入信号的数值数据存储在signals.values字段中,而非直接取out.input。修改输入输出变量的提取代码:
% 正确提取Simulink输出的数值矩阵 I = out.input.signals.values'; T = out.output.signals.values';
如果out.input包含多个信号,需要将所有信号合并为一个矩阵:
% 多信号合并示例 signal1 = out.input(1).signals.values'; signal2 = out.input(2).signals.values'; signal3 = out.input(3).signals.values'; I = [signal1, signal2, signal3];
2. 验证变量类型
执行以下命令确认I是否为二维数值矩阵:
whos('I'); disp(I);
如果输出显示I的类型为double且维度为[样本数, 特征数],则符合minmax的输入要求。若仍为结构体/对象,可强制转换为数值矩阵:
I = double(out.input.signals.values)';
3. 适配MATLAB新版ANN函数(推荐)
newff是MATLAB旧版神经网络函数,在R2022b中已被feedforwardnet替代,新版函数无需手动传入minmax结果,会自动处理数据归一化,同时兼容性更好:
% 提取正确的数值矩阵 I = out.input.signals.values'; T = out.output.signals.values'; % 使用新版前馈神经网络函数 net = feedforwardnet([3,5], 'trainlm'); % 设置各层激活函数 net.layers{1}.transferFcn = 'logsig'; net.layers{2}.transferFcn = 'tansig'; % 训练参数设置 net.trainParam.show = 1; net.trainParam.epochs = 10000; net.trainParam.goal = 1e-12; % 启动训练 net = train(net, I, T);
关键注意点
- 非Simulink数据的代码正常运行,说明问题仅出在Simulink数据的提取环节,重点排查
out.input的结构 - 若
minmax仍报错,可手动计算输入数据的极值范围,替代minmax(I):
input_min = min(I, [], 1); input_max = max(I, [], 1); net = newff([input_min; input_max], [3,5,1], {'logsig','tansig','purelin'}, 'trainlm');
内容的提问来源于stack exchange,提问作者HAKEEM BIN HAMZAH STUDENT
相关产品推荐
相关产品推荐

