文档

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

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

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

MATLAB函数块使您能够通过使用MATLAB语言在Simulink模型中定义自定义功能。金宝app您可以为包含MATLAB函数通过使用行主数据或列主数据来阻塞。有关MATLAB函数块,看到用块实现MATLAB函数(金宝app模型)。

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

行代码生成

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

  1. 考虑一个示例模型ex_row_major_MLFB

    该模型包含一个Constant块,该块具有(5 - 4)矩阵。要指定矩阵,集合恒定值:

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

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

  3. 写一个函数为矩阵加法调用addMatrix.的MATLAB函数块从模型配置参数继承数组布局设置阵列布局除非另有指定。

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

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

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

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

For (b_row = 0;b_row < 5;B_row ++) {for (b_col = 0;b_col < 4;b_col++) {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函数块和模型是相同的,生成的代码是有效的,因为不需要转置或转换。

Mixed-Majority代码生成

当您有一个操作行主数据的模型和一个MATLAB函数对列主数据进行操作的块。当您为使用列主布局的模型生成代码时,且模型包含使用行主布局的MATLAB函数块,则代码生成器会根据需要将块输入数据转换为行主数据,将块输出数据转换为列主数据。当您有一个操作列主数据的模型时,您也可以生成混合多数代码MATLAB函数对行主数据进行操作的块。

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

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

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

  2. 更新addMatrix功能MATLAB函数块来处理列主数据coder.columnMajor函数。

    函数S = addMatrix(A,B) code . columnmajor;S = 0(大小(A));行= 1:尺寸(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];[B_tmp_0] = ex_row_major_MLFB_19b_P.Constant_Value [B_tmp];}} for (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函数块时,代码生成器将数据转换回行主数据,然后将数据传递给外港

相关的话题