主要内容

在函数和类中指定数组布局

您可以专门化个别MATLAB®通过插入实现行为主布局或列为主布局的函数coder.rowMajorcoder.columnMajor调用函数体。使用这些函数专门化,您可以在生成的代码中组合行为主数据和列为主数据。您还可以针对一个特定的数组布局专门化类。函数和类专门化允许您:

  • 增量地修改行为主布局或列为主布局的代码。

  • 为在不同组件中需要不同布局的应用程序定义数组布局边界。

  • 构造许多不同函数和类之间数组布局的继承。

MATLAB编码器™入口点(顶级)函数,所有输入和输出必须使用相同的数组布局。在生成的C/ c++代码中,入口点函数接口接受并返回与函数数组布局规范相同的数组布局数据。

请注意

默认情况下,代码生成使用列为主的数组布局。

在函数中指定数组布局

对于专门化函数的示例,请考虑addMatrixRM

函数[S] = addMatrixRM (A, B)% # codegenS = 0(大小(A));coder.rowMajor;%指定行主代码行= 1:尺寸(1)坳= 1:尺寸(2)年代(行,坳)=(行,上校)+ B(行,坳);结束结束

MATLAB编码器,可以为其生成代码addMatrixRM通过使用codegen命令。

codegenaddMatrixRMarg游戏{的(20、10)的(20、10)}配置:自由-launchreport

因为coder.rowMajor调用时,代码生成器生成使用存储在行主布局中的数据的代码。

从行为主函数或列为主函数调用的其他函数继承相同的数组布局。如果一个被调用的函数有自己独特的coder.rowMajorcoder.columnMajor呼叫时,本地呼叫优先。

可以在同一代码中混合列为主函数和行为主函数。代码生成器在行为主函数和列为主函数之间传递数据时插入转置或转换操作。这些转换操作确保数组元素按照具有不同数组布局规范的函数所需要的方式存储。例如,列为主函数的输入(从行为主函数调用)在传递给列为主函数之前被转换为列为主布局。

查询函数的阵列布局

要在编译时查询函数的数组布局,请使用coder.isRowMajorcoder.isColumnMajor.当所生成的代码涉及行主函数和列主函数时,该查询对于专门化非常有用。例如,考虑这个函数:

函数[S] = addMatrixRouted (A, B)如果coder.isRowMajor如果行为主,执行此代码S = addMatrixRM (A, B);elseifcoder.isColumnMajor如果列为主,执行此代码S = addMatrix_OptimizedForColumnMajor (A, B);结束

这个函数的行为取决于它是行为主还是列为主。当addMatrixRouted是row-major吗addMatrixRM函数,它对行主数据具有有效的内存访问。当函数为列为主时,它调用addMatrixRM为列主要数据优化的函数。

例如,考虑这个函数定义。该算法遍历外部循环中的列和内部循环中的行,这与addMatrixRM函数。

函数[S] = addMatrix_OptimizedForColumnMajor (A, B)% # codegenS = 0(大小(A));坳= 1:尺寸(2)行= 1:尺寸(1)年代(行,坳)=(行,上校)+ B(行,坳);结束结束

该函数的代码生成结果如下:

.../* column-major layout */ for (col = 0;坳< 10;Col ++) {for (row = 0;行< 20;row++) {S[row + 20 * col] = A[row + 20 * col] + B[row + 20 * col];}}…

生成的代码的步长只有一个元素。由于专门化查询,生成的代码用于addMatrixRouted为任意阵列布局的选择提供有效的内存访问。

在类中指定数组布局

您可以为类指定数组布局,以便对象属性变量与特定的数组布局一起存储。要指定数组布局,请放置acoder.rowMajorcoder.columnMajor调用类构造函数。如果将具有指定数组布局的对象分配给另一个对象的属性,则所分配对象的数组布局优先。

考虑row-major类rowMats作为一个例子。该类包含矩阵属性和一个方法,该方法由按元素顺序的加法算法组成。对于存储在行主布局中的数据,该方法中的算法执行起来更有效。通过指定coder.rowMajor在类构造函数中,生成的代码对属性数据使用行为主的布局。

classdefrowMats属性(Access = public) A;B;C;结束方法函数obj = rowMats(A,B) codeer . rowmajor;如果Nargin == 0 obj。= 0;obj。B = 0;obj.C = 0;其他的obj。一个=;obj。B = B;obj.C = 0(大小(A));结束结束函数obj =添加(obj)行= 1:尺寸(obj.A, 1)col = 1:size(obj.A,2) obj.C(row,col) = obj.A(row,col) + obj.B(row,col);结束结束结束结束结束

在一个简单的函数中使用该类doMath.入口点函数的输入和输出必须都使用相同的数组布局。

函数[出]= doMath (in1, in2)% # codegen= 0(大小(in));myMats = rowMats (in1, in2);myMats = myMats.add;= myMats.C;结束

MATLAB编码器,你可以输入:

一个=兰德(20、10);10 B =兰特(20日);cfg = coder.config (“自由”);codegen配置cfgdoMatharg游戏{A、B}-launchreport

在默认设置下,代码生成器假定入口点函数的输入和输出使用以列为主的布局,因为您没有为函数指定以行为主的布局doMath.因此,在调用类构造函数之前,生成的代码进行转换三机一体in2行布局。类似地,它转换doMath函数输出回列为主布局。

在为特定数组布局设计类时,请考虑:

  • 如果没有在类构造函数中指定数组布局,则对象将从调用类构造函数的函数或从代码生成配置设置继承它们的数组布局。

  • 在非静态方法中,不能使用coder.rowMajorcoder.columnMajor.方法使用与接收对象相同的数组布局。方法不会继承调用它们的函数的数组布局。对于与普通函数类似的静态方法,可以在方法中指定数组布局。

  • 如果指定超类的数组布局,则子类将继承该数组布局规范。不能在父类和子类之间指定冲突的数组布局。

另请参阅

||||

相关的话题