主要内容

矩阵和数组的代码生成

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);A(2) = A(2,1) = 4;A(3) = A(3,1) = 7;A(4) = A(1,2) = 2;A(5) = A(2,2) = 5;
等等。

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

  • (我)(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, LAPack, Fortran90和DSP库。

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

  • 列主数组与它的子矩阵组件是自一致的:

    • 列主二维数组是一维数组的简单串联。

    • 列主三维阵列是二维阵列的简单串联。

    • 步幅是在同一维度中索引下一个元素的内存位置数。第一个维度的步幅是一个元素。第n维元素的步幅是较低维度尺寸的乘积。

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

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

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

使用如下方法创建将外部代码函数与生成代码集成在一起的s -函数:

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

你也可以用coder.ceval在一个MATLAB函数块。看到在MATLAB函数块中与行-主数据接口

代码生成器矩阵参数

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

列为主的布局

例如,3 × 3矩阵常数

1 2 3 4 5 6 7 8 9
存储在模型.rtw作为
参数{标识符“Constant_Value LogicalSrc P0保护没有价值(1.0,4.0,7.0,2.0,5.0,8.0,3.0,6.0,9.0]CGTypeIdx 18 ContainerCGTypeIdx 19 ReferencedBy矩阵(1、4)[[0 1 0,0];]GraphicalRef矩阵(1、2)[[0,1];]BHMPrmIdx 0 GraphicalSource [0, 1] OwnerSysIdx [0, 1] VarGroupIdx (1,0) WasAccessedAsVariable 1}

模型_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保护没有价值(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]CGTypeIdx 18 ContainerCGTypeIdx 19 ReferencedBy矩阵(1、4)[[0 1 0,0];]GraphicalRef矩阵(1、2)[[0,1];]BHMPrmIdx 0 GraphicalSource [0, 1] OwnerSysIdx [0, 1] VarGroupIdx (1,0) WasAccessedAsVariable 1}

模型_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控制器(2自由度)

  • 状态方程

  • 转移Fcn

  • 运输延迟

  • 变量的时间延迟

  • 变量传输延迟

  • Zero-Pole

字符串操作模块

  • ASCII字符串

  • 组成字符串

  • 扫描字符串

  • 字符串比较

  • 字符串连接

  • 字符串常量

  • 字符串包含

  • 字符串数

  • 字符串中找到

  • 字符串长度

  • ASCII字符串

  • 字符串双

  • 字符串枚举

  • 字符串单

  • 子字符串

  • 字符串

用户定义函数

  • 解释MATLAB函数

  • 2级MATLAB函数

来源

  • 从电子表格

信号的属性

  • 集成电路

行主代码生成的限制

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

相关的话题