主要内容

代码行阵列布局设计

外的代码生成,MATLAB®使用默认列为主的布局。阵列布局规范不影响独立的MATLAB代码。测试生成的代码或者你的效率MATLAB函数块,创建单独的版本与行布局和列为主的布局。然后,比较它们的性能。

你可以设计你的MATLAB代码来避免潜在的低效率与阵列布局。效率低下可能是由于:

  • 之间的转换行布局和列为主的布局。

  • 行数据的一维或线性索引。

  • 行数据的重塑或重排。

阵列布局转换是必要的,当你把行和列为主的规格相同的代码或模型,或当您使用线性索引存储在存储的数据。当你模拟模型或模型生成代码,使用列为主,包含一个MATLAB函数块,使用行,那么软件将输入数据转换为存储和输出数据根据需要回到列为主,反之亦然。

效率低下可能是由于函数或更优化的算法对于一个给定的选择阵列布局。如果一个函数或算法更高效的不同的布局,你可以执行布局通过嵌入在另一个函数coder.rowMajorcoder.columnMajor调用。

了解潜在的效率低下造成的阵列布局

考虑到代码myMixedFn2,它使用coder.ceval通过数据行和列为主的布局:

函数[B, C] = myMixedFn2 (x, y)% # codegen%为ceval指定类型的返回参数调用一个= 0(大小(x));B = 0(大小(x));C = 0(大小(x));%包括外部C函数使用行和列为主coder.cinclude (“addMatrixRM.h”);coder.updateBuildInfo (“addSourceFiles”,“addMatrixRM.c”);coder.cinclude (“addMatrixCM.h”);coder.updateBuildInfo (“addSourceFiles”,“addMatrixCM.c”);%调用C函数,使用列为主的秩序coder.ceval (“布局:columnMajor”,“addMatrixCM”,coder.rref (x) coder.rref (y), coder.wref (A));%计算Bi = 1:元素个数B (A) (i) = (1) + 7;结束%使用行顺序调用C函数coder.ceval (“布局:rowMajor”,“addMatrixRM”,coder.rref (y), coder.rref (B), coder.wref (C));结束

外部文件:

addMatrixRM.h

addMatrixRM.c

addMatrixCM.h

addMatrixCM.c

声明配置对象,cfg。通过使用生成代码,使用行布局-rowmajor选择。

cfg = coder.config (“自由”);cfg。HighlightPotentialRowMajorIssues = true;codegenmyMixedFn2arg游戏{的(20、10)的(20、10)}配置cfg-launchreport-rowmajor

突出问题是显示在代码生成报告,在代码的见解选项卡,在潜在的重大问题行部分。

这张图片显示了myMixedFn2代码生成报告。它显示报告的底部的突出问题。

阵列布局发生因为效率低下:

  • 代码生成器必须将输入变量xy通过他们之前列为主的布局addMatrixCM。转置必须插入到生成的代码中。

  • 代码生成器必须转置输出变量一个回行布局,因为myMixedFn2使用行布局。

  • 循环使用线性索引,需要列为主的数据。代码生成器必须重新计算线性索引,因为变量一个B存储在存储。

线性数组索引使用列为主的布局

代码生成器是MATLAB为线性索引列为主的语义。线性索引在MATLAB的更多信息,请参阅数组索引

使用线性索引行数据,代码生成器必须首先重新计算的数据表示列为主的布局。这种额外的处理可以缓慢的性能。提高代码效率,避免使用线性索引行数据,或者使用列为主的布局代码使用线性索引。

例如,考虑函数sumShifted下载188bet金宝搏Products接受一个矩阵作为输入和输出标量值。输入矩阵的函数使用线性索引总结每个矩阵元素的乘积与相邻元素。这个操作的输出值取决于输入元素的顺序存储。

函数mySum = sumShifted下载188bet金宝搏Products (A)% # codegenmySum = 0;%创建线性向量的元素B = (:);% B乘以B元素转移,并采取总和mySum =总和(B * circshift (B - 1));结束

MATLAB编码器™,用行布局来生成代码,输入:

codegen配置:墨西哥人sumShifted下载188bet金宝搏Productsarg游戏{1 (2、3)}-launchreport-rowmajor

例如输入,考虑矩阵:

D =重塑(1:6、3、2)'

收益率:

D = 1 2 3 4 5 6

如果你通过这个矩阵对所生成的代码作为输入,的元素一个存储的顺序:

1 2 3 4 5 6

相比之下,因为向量B是通过线性索引,它存储的顺序:

1 4 2 5 3 6

代码生成器必须插入一个重塑手术重新排列数据行布局一个为列为主的布局B。这些额外的操作降低了行布局函数的效率。数组的大小的低效率增加。因为线性索引总是使用列为主的布局,生成的代码sumShifted下载188bet金宝搏Products产生相同的输出结果是否生成行布局或列为主的布局。

一般来说,函数计算指标或下标也使用线性索引,并产生结果对应于数据存储在列为主的布局。这些功能包括:

另请参阅

||||

相关的话题