文档

矩阵和数组的代码生成

MATLAB®将矩阵数据和数组(1-D, 2-D,…)以列主格式存储为向量。金宝app动态仿真模块®代码生成器可以以列主格式或行主格式存储数组数据。对于以列为主布局存储的数组,列的元素在内存中是连续的。在行为主布局中,行元素是连续的。数组布局也被称为顺序、格式和表示。元素存储的顺序对于集成、可用性和性能很重要。某些算法在以特定顺序存储的数据上表现更好。

编程语言和环境假设所有数据都采用单一数组布局。MATLAB和Fortran默认使用列主布局,而C和c++使用行主布局。与金宝app仿真软件编码器™,您可以生成使用行主布局或列主布局的C/ c++代码。

计算机存储器中的阵列存储

计算机存储器以一维数组的形式存储数据。例如,当您声明一个3 × 3矩阵时,软件将该矩阵存储为具有9个元素的一维数组。默认情况下,MATLAB使用列主数组布局存储这些元素。每个列的元素在内存中是连续的。

考虑矩阵一个

A = 1 2 3 4 5 6 7 8 9
一个转换为长度为9的数组,顺序如下:
A(1) = A(1,1) = 1;A(2) = A(2,1) = 4;A(3) = A(3,1) = 7;A(4) = A(1,2) = 2;A(5) = A(2,2) = 5;
等等。

在列主格式中,内存中数组的下一个元素是通过递增数组的第一个索引来访问的。例如,这些元素对按顺序存储在内存中:

  • (我)而且(i + 1)

  • B (i, j)而且B (i + 1, j)

  • C (i, j, k)而且C (i + 1 j k)

矩阵一个默认情况下在内存中以这种方式表示:

1 4 7 2 5 8 3 6 9

在行主数组布局中,编程语言将行元素连续地存储在内存中。在行为主布局中,数组的元素存储为:

1 2 3 4 5 6 7 8 9

可以将n维数组存储为主列布局或主行布局。在主列布局中,来自第一个(最左边)维度或索引的元素在内存中是连续的。在行主布局中,来自最后(最右边)维度或索引的元素是连续的。

有关MATLAB数据的内部表示的更多信息,请参见MATLAB数据(MATLAB)。

代码生成软件默认使用列-主格式,原因如下:

  • 信号和阵列处理的世界主要是列-主阵列布局:MATLAB、LAPack、Fortran90和DSP库。

  • 在基于帧的处理中,列相当于通道。在这种情况下,主列存储更有效。

  • 列主数组与其组成子矩阵是自洽的:

    • 列主2-D数组是1-D数组的简单连接。

    • 列主3-D数组是2-D数组的简单连接。

    • 步幅是要索引到同一维度中的下一个元素的内存位置的数量。第一个维度的步幅是一个元素。第n维元素的步幅是低维元素大小的乘积。

    • 对于最高维度,行主n-D数组的步幅为1。子矩阵操作通常访问内存中的分散数据集,这不允许有效的索引。

C使用行主格式。MATLAB和Simu金宝applink默认使用列-主格式。您可以配置代码生成软件,以生成具有行主数组布局的代码。如果您正在将外部C代码与生成的代码集成,请参阅本表中列出的注意事项。

行动 考虑
为代码生成配置模型的数组布局。 在“配置参数”对话框中,设置模型配置参数阵列布局列为主
启用高效的行主算法进行模拟和代码生成。 选择型号配置参数使用针对行主数组布局优化的算法(金宝app模型)。
将行主数组布局中的外部C代码函数与生成的代码集成。

创建s函数,通过使用以下方法将外部代码函数与生成的代码集成:

使用C Caller块调用外部C函数到Simulink。金宝app使用模型配置参数指定自定义C函数的数组布局默认函数数组布局(金宝app模型)。

你也可以使用coder.ceval在一个MATLAB函数块。看到MATLAB函数块中行主数据的接口(金宝app模型)。

代码生成器矩阵参数

编译后的模型文件,模型.rtw,在MATLAB语法中将矩阵表示为字符向量,没有隐含的存储格式。此格式使您能够将字符向量从.rtw文件,粘贴到MATLAB文件中,让MATLAB来识别。

列为主的布局

例如,矩阵中的3 × 3矩阵常数

1 2 3 4 5 6 7 8 9
存储在模型.rtw作为
参数{标识符"Constant_Value" LogicalSrc P0 Protected no Value [1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0] CGTypeIdx 18 ContainerCGTypeIdx 19 ReferencedBy Matrix(1,4) [[0, -1, 0,0];] GraphicalRef Matrix(1,2) [[0,1];] BHMPrmIdx 0 GraphicalSource [0,1] OwnerSysIdx [0, -1] VarGroupIdx [1,0] WasAccessedAsVariable 1}

模型_data.cFile声明了矩阵参数的实际存储空间。您可以看到格式为列-主布局。

参数模型_P ={/*表达式:[[1,2,3];(4、5、6);[7 8 9]]*引用:“< Root > /常数”* / {1.0,4.0,7.0,2.0,5.0,8.0,3.0,6.0,9.0}};

行布局

例如,矩阵中的3 × 3矩阵常数

1 2 3 4 5 6 7 8 9
存储在模型.rtw作为
参数{标识符"Constant_Value" LogicalSrc P0 Protected no Value [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] CGTypeIdx 18 ContainerCGTypeIdx 19 ReferencedBy Matrix(1,4) [[0, -1, 0,0];] GraphicalRef Matrix(1,2) [[0,1];] BHMPrmIdx 0 GraphicalSource [0,1] OwnerSysIdx [0, -1] VarGroupIdx [1,0] WasAccessedAsVariable 1}

模型_data.hFile声明了矩阵参数的实际存储空间。您可以看到格式是行为主的布局。

参数模型_P ={/*表达式:[[1,2,3];(4、5、6);[7 8 9]]*引用:“< Root > /常数”* / {1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0}};

复数阵列的内部数据存储

金宝appSimulink和代码生成器内部数据存储格式化不同于MATLAB内部数据存储格式化只在复杂数字数组的存储上。在MATLAB中,实部和虚部存储在单独的数组中。在Si金宝appmulink和代码生成器中,各部分以交错格式存储。内存中的数字交替出现实数、虚数、实数、虚数,以此类推。该约定允许在Simulink线上高效地实现小信号,用于金宝appMux块,以及其他虚拟信号操作块。例如,信号不主动复制它们的输入,只复制引用。

行主金宝app代码生成不支持的块

代码生成器不支持在行主数组布局中生成这些代码块。金宝app

连续

  • 导数

  • 积分器

  • 积分器有限

  • 积分器,二阶

  • 积分者,二阶有限公司

  • PID控制器

  • PID控制器(2DOF)

  • 状态方程

  • 转移Fcn

  • 运输延迟

  • 可变时延

  • 可变运输延迟

  • Zero-Pole

用户定义函数

  • MATLAB解释函数

  • 二级MATLAB s函数

  • MATLAB系统

来源

  • 从电子表格

行主代码生成的限制

  • 行主码生成不支持可变大小的信号。金宝app

相关的话题