主要内容

指定数组函数和类的布局

你可以专门独立的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行,它调用addMatrixRM行数据的功能,高效的内存访问。当函数列为主时,它调用的一个版本addMatrixRM函数列为主的数据优化。

例如,考虑这个函数的定义。算法遍历列外循环和内循环中的行,形成鲜明对比addMatrixRM函数。

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

这个函数收益率的代码生成:

…* / / *列为主的布局(col = 0;坳< 10;+ +){上校(行= 0;行< 20;行+ +){S[行+ 20 *坳]=[行+ 20 *坳]+ B[行+ 20 *坳];}}…

生成的代码有一个只有一个元素的步幅。由于专业查询,生成的代码addMatrixRouted提供高效的内存访问数组要么选择布局。

在一个类指定阵列布局

您可以指定阵列布局为一个类,对象属性变量存储与特定的阵列布局。指定阵列布局,放置一个coder.rowMajorcoder.columnMajor调用类的构造函数。如果你分配一个对象与指定数组布局到另一个对象的属性,该数组分配对象的布局优先。

考虑行类rowMats作为一个例子。这个类包含矩阵的属性和方法,包括以聪明元素添加算法。方法执行的算法更有效地用于数据存储在存储布局。通过指定coder.rowMajor在类的构造函数,生成的代码使用行布局的属性数据。

classdefrowMats属性(=公共访问);B;C;结束方法函数obj = rowMats (A, B) coder.rowMajor;如果输入参数个数= = 0 obj。= 0;obj。B = 0;obj。C = 0;其他的obj。一个=;obj。B = B;obj。C = 0(大小(A));结束结束函数obj =添加(obj)行= 1:尺寸(obj.A, 1)坳= 1:尺寸(obj.A, 2) obj.C(行,坳)= obj.A(行,坳)+ obj.B(行,坳);结束结束结束结束结束

在一个简单的函数中使用类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。方法使用相同的阵列布局接收对象。方法不继承的阵列布局函数调用它们。使用静态方法,类似于普通函数,您可以指定阵列布局的方法。

  • 如果指定数组布局的超类,子类继承这个数组布局规范。你不能指定阵列布局父类和子类之间的冲突。

另请参阅

||||

相关的话题