我有以下问题。
我有一个SIMULINK模型,在这个模型中我有一个块:Matlab函数,如下 http://it.mathworks.com/help/simulink/slref/matlabfunction.html
我的功能是输入:
在输出中我想要一个3D矩阵,所以矩阵R的尺寸(3 X 3 X N)。
但是我收到以下错误:
Data 'R' (#41) is inferred as a variable size matrix, while its specified
type is something else.
Component: MATLAB Function | Category: Coder error
你能帮帮我吗?
块中的功能如下:
function R = fcn(u,n_robots)
% u is the vector of the quaternions.
% If there are 2 robots involved the u will look like this:
% u=[w1 x1 y1 z1 w2 x2 y2 z2]'
%#eml
assert(n_robots<10);
% Initialization of the variables. If you remove this it won't work because
% code generation doesn't support dynamic changing size variables.
w=zeros(n_robots,1);
x=zeros(n_robots,1);
y=zeros(n_robots,1);
z=zeros(n_robots,1);
n=zeros(n_robots,1);
Rxx=zeros(n_robots,1);
Rxy=zeros(n_robots,1);
Rxz=zeros(n_robots,1);
Ryx=zeros(n_robots,1);
Ryy=zeros(n_robots,1);
Ryz=zeros(n_robots,1);
Rzx=zeros(n_robots,1);
Rzy=zeros(n_robots,1);
Rzz=zeros(n_robots,1);
R=zeros(3,3,n_robots);
for i=0:n_robots-1
w(i+1) = u( 1+3*i );
x(i+1) = u( 2+3*i );
y(i+1) = u( 3+3*i );
z(i+1) = u( 4+3*i );
n(i+1) = sqrt(x(i+1)*x(i+1) + y(i+1)*y(i+1) + z(i+1)*z(i+1) + w(i+1)*w(i+1));
x(i+1) = x(i+1)/ n(i+1);
y(i+1) = y(i+1)/ n(i+1);
z(i+1) = z(i+1)/ n(i+1);
w(i+1) = w(i+1)/ n(i+1);
Rxx(i+1) = 1 - 2*(y(i+1)^2 + z(i+1)^2);
Rxy(i+1) = 2*(x(i+1)*y(i+1) - z(i+1)*w(i+1));
Rxz(i+1) = 2*(x(i+1)*z(i+1) + y(i+1)*w(i+1));
Ryx(i+1) = 2*(x(i+1)*y(i+1) + z(i+1)*w(i+1));
Ryy(i+1) = 1 - 2*(x(i+1)^2 + z(i+1)^2);
Ryz(i+1) = 2*(y(i+1)*z(i+1) - x(i+1)*w(i+1) );
Rzx(i+1) = 2*(x(i+1)*z(i+1) - y(i+1)*w(i+1) );
Rzy(i+1) = 2*(y(i+1)*z(i+1) + x(i+1)*w(i+1) );
Rzz(i+1) = 1 - 2 *(x(i+1)^2 + y(i+1)^2);
R(:,:,i+1) = [
Rxx(i+1), Rxy(i+1), Rxz(i+1);
Ryx(i+1), Ryy(i+1), Ryz(i+1);
Rzx(i+1), Rzy(i+1), Rzz(i+1)];
end
答案 0 :(得分:3)
您可能需要对整个模型进行参数化,以便您可以使用不同数量的机器人重复模拟并收集结果。
要么计算出最大数量的机器人并确保所有变量都设置为最大容量 - 请填充机器人未使用的空间,使用0或-1或NaN将其标记为未使用(适合您的任何内容)。
答案 1 :(得分:0)
我同意@James给出的答案,参数化大小的模型,是理想的。您可以将n_robots
声明为MATLAB功能块的non-tunable parameter,然后在每次模拟期间将该值视为常量。这将在每次模拟期间使R
固定大小。但是,可以在模拟之间更改值以处理其他数量的机器人。
但是,为了完整性,您可以将输出信号R
设置为可变大小。从MATLAB功能块编辑器中,单击&#34;编辑数据&#34;。查找并选择R
的条目。检查&#34;变量大小&#34;复选框并输入适当的上限。 [3,3,10]
似乎就足够了。
有关使用MATLAB功能块的可变大小数据的更多信息,请访问:
http://www.mathworks.com/help/simulink/variable-size-data.html