如果您使用MATLAB Coder或GPU Coder时遇到运行时问题(例如错误的结果或崩溃),则最好使用MATLAB/GPU Coder应用程序。这些应用程序有一个有用的功能,可以帮助检测运行时问题。
为此,您首先需要编写一个testbench脚本(例如
状态方程_tb.m
)那叫
状态方程
并生成上面显示的输出:
%%stateequation_tb.m的内容
a=[22;22;22];
b=[22;22;22];
[2 2 2;2 2 2;2 2 2];
d=[22;22;22];
x=[2;2;2];
u=[22;22;22];
%调用函数
out=状态方程(a,b,c,d,x,u)
打开GPU编码器应用程序,指定功能
状态方程
及其相关的试验台
stateequation_tb.m,
并选择“检查CPU上的问题”。应引发以下运行时错误:
指数超过数组维度。索引值2超出了数组“x”的有效范围[1-1]。
这是因为在运行时修改了输入数组X的大小。虽然MATLAB能够处理这一点(这就是为什么MATLAB如此酷且易于使用的原因!-),但如果您的目标是生成C/CUDA代码,则这一点并不顺利。
这可以通过使用一个大小正确的复制'x'的数组来修复:
函数out=状态方程(a,b,c,d,x,u)%#编码基因
n=尺寸(u,2);
coder.gpu.kernel()
z=零(尺寸(x,1),n+1);%%定义大小正确的局部变量
z(:,1:size(x,2))=x;%%将x复制到z的相应位置
对于i=1:n
z(:,i+1)=a*z(:,i)+b*u(:,i);% %状态方程
终止
out=c*z(:,1:n)+d*u(:,1:n);%%输出方程
终止
如果现在重新生成MEX文件,应该会得到正确的结果。