给出错误输出的Mex文件

2个视图(过去30天)
嗨,我正在为我的状态空间方程生成一个mex文件,并在GPU上运行它。当我运行mex文件时,我得到的输出与预期的不同。
我的状态空间方程是:
函数out=状态方程(a,b,c,d,x,u)%#编码基因
n=尺寸(u,2);
coder.gpu.kernel()
对于i=1:n
x(:,i+1)=a*x(:,i)+b*u(:,i);% %状态方程
终止
out=c*x(:,1:n)+d*u(:,1:n);%%输出方程
终止
运行此代码时,我得到的答案如下:
24 156 948
24 156 948
24 156 948
我使用codegen方法生成了mex文件,如下所示:
A=双(零(3,3));
B=双(零(3,3));
C=双(零(3,3));
双(D = 0 (3,3));
双(X = 0 (3,1));
U=双(零(3,3));
cfg=coder.gpuConfig(“墨西哥”);
编码基因-args{A,B,C,D,X,U}-状态方程
但在运行此mex文件时,我得到的结果如下:
156 156 156
156 156 156
156 156 156
为什么它给出了不同的答案?有人能帮我吗?
先谢谢你

公认的答案

斯蒂芬妮·施瓦兹
斯蒂芬妮·施瓦兹 2020年5月13日
编辑:斯蒂芬妮·施瓦兹 2020年5月13日
如果您使用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文件,应该会得到正确的结果。
1评论
布山拉文德拉阿塔德酒店
谢谢你,斯特加尼。代码现在可以正常工作了

登录以发表评论。

更多答案(0)

标签

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!