主要内容

为包含MATLAB函数块的模型生成行主代码

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

要了解有关行主代码生成的更多信息,请参见矩阵和数组的代码生成

MATLAB函数块允许您使用MATLAB语言在Simulink模型中定义自定义功能。万博1manbetx类型的模型可以生成行主代码MATLAB函数通过使用行主数据或列主数据进行块。欲知更多有关MATLAB函数块,看到用MATLAB函数块在Simulink中实现MATLAB函数万博1manbetx

默认情况下,代码生成器生成列主代码。对于C/ c++代码生成,可以在模型级别上使用阵列布局模型配置参数。将此参数设置为启用用于生成行主码的模型。要启用MATLAB函数块用于生成行主代码,请使用coder.rowMajor在块内的函数级别上执行函数。

行-主要代码生成

对于某些算法,行主布局提供了更有效的内存访问。当为使用行主数组布局的模型生成代码且模型包含MATLAB函数对行主数据使用算法的块。

  1. 考虑一个示例模型ex_row_major_MLFB

    此模型包含一个常量块,该块具有(5 - 4)矩阵。要指定矩阵,请设置恒定值:

    重塑(1:20,5、4)
    import块还指定了(5 - 4)矩阵。要指定矩阵,请设置港维(5 - 4)

  2. 2 .在“配置参数”对话框中设置阵列布局

  3. 写一个矩阵加法函数叫做addMatrix.的MATLAB函数块从模型配置参数继承数组布局设置阵列布局除非另有说明。

    您可以选择使用coder.rowMajor控件的数组布局MATLAB函数块到行主布局。

    函数S = addMatrix(A,B) S = 0 (size(A));行= 1:大小(A,1)坳= 1:尺寸(2)年代(行,坳)=(行,上校)+ B(行,坳);结束结束

  4. 为模型生成代码。从C代码选项卡上,单击构建

代码生成器生成以下C代码:

For (b_row = 0;B_row < 5;B_row ++) {for (b_col = 0;B_col < 4;{rtb_S_tmp = (b_row << 2) + b_col;rtb_S[rtb_S_tmp] = ex_row_major_MLFB_P。Constant_Value[rtb_S_tmp] + ex_row_major_MLFB_U.Inport1[rtb_S_tmp];}}
生成的代码有两个循环。第一个循环访问行和第二行循环访问列。时数组的布局MATLAB函数块和模型是相同的,生成的代码是高效的,因为不需要转置或转换。

混合多数代码生成

当您拥有一个操作行主数据的模型时,您可以生成混合多数代码MATLAB函数操作列主数据的块。当您为使用列主布局的模型生成代码时,并且该模型包含使用行主布局的MATLAB Function块,那么代码生成器会根据需要将块输入数据转换为行主数据,并将块输出数据转换回列主数据。当您有一个操作列主数据的模型时,还可以生成混合多数代码MATLAB函数操作行主数据的块。

数组布局转换会影响性能。

  1. 考虑示例模型ex_row_major_MLFB.有关示例模型的更多信息,请参见行-主要代码生成

    2 .在“配置参数”对话框中设置阵列布局

  2. 更新addMatrixMATLAB函数块用于列主要数据coder.columnMajor函数。

    函数S = addMatrix(A,B) code . columnmajor;S = 0(大小(A));行= 1:大小(A,1)坳= 1:尺寸(2)年代(行,坳)=(行,上校)+ B(行,坳);结束结束
    属性可以生成混合多数代码MATLAB函数块。在本例中,为行主数组布局配置模型MATLAB函数块用于列-主数组布局。

  3. 为模型生成代码。从C代码选项卡上,单击构建

代码生成器生成以下C代码:

For (b_row = 0;B_row < 4;B_row ++) {for (b_col = 0;B_col < 5;b_col++) {B_tmp = (b_col << 2) + b_row;B_tmp_0 = b_col + 5 * b_row;B[B_tmp_0] = ex_row_major_MLFB_19b_U.Inport1[B_tmp];A[B_tmp_0] = ex_row_major_MLFB_19b_P.Constant_Value[B_tmp];(b_row = 0;B_row < 5; b_row++) { /* Outport: '/Outport' */ for (b_col = 0; b_col < 4; b_col++) { B_tmp = 5 * b_col + b_row; ex_row_major_MLFB_19b_Y.Outport[b_col + (b_row << 2)] = A[B_tmp] + B[B_tmp]; }
的输入MATLAB函数块存在于行为主的环境中。代码生成器对输入执行转换操作,然后将它们提供给MATLAB函数块,因为块是列为主布局。经过处理后的算法在MATLAB函数块时,代码生成器在将数据传递给对象之前将数据转换回行主数据外港

相关的话题