矩阵和数组的代码生成
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模型)。 你也可以使用 |
代码生成器矩阵参数
编译后的模型文件,
,在MATLAB语法中将矩阵表示为字符向量,没有隐含的存储格式。此格式使您能够将字符向量从模型
.rtw.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}
的
File声明了矩阵参数的实际存储空间。您可以看到格式为列-主布局。模型
_data.c
参数模型_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}
的
File声明了矩阵参数的实际存储空间。您可以看到格式是行为主的布局。模型
_data.h
参数模型_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
相关的话题
- MATLAB数据(MATLAB)
- 将MATLAB类型映射到生成代码中的类型(MATLAB编码器)
- 行-主数组和列-主数组布局(MATLAB编码器)
- 多维数组的维数保存(嵌入式编码)
- MATLAB函数块中行主数据的接口(金宝app模型)