文档

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

你可以专门化单独的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调用时,代码生成器将生成使用存储在行主布局中的数据的代码。

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

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

查询指定函数的Array布局信息

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

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

根据是行为主还是列为主,此函数的行为不同。当addMatrixRouted是行大调,它叫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;{S[行+ 20 * col] = A[行+ 20 * col] + B[行+ 20 * col];}}…

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

在类中指定数组布局

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

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

classdefrowMats属性(Access = public);B;C;结束方法函数obj = rowMats(A,B) code . 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)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.方法使用与接收对象相同的数组布局。方法不继承调用它们的函数的数组布局。对于与普通函数使用相似的静态方法,您可以在方法中指定数组布局。

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

另请参阅

|||

相关的话题