稀疏矩阵的代码生成

稀疏矩阵为具有许多零元素的数组提供了高效的内存存储。稀疏矩阵可以为生成的代码提供更好的性能和减少内存使用。在稀疏矩阵上的计算时间只与对非零元素的操作次数有关。

中列出了创建和操作稀疏矩阵的函数稀疏矩阵(matlab)。要检查代码生成是否支持函数,请参阅“函数参考”页面。万博1manbetx代码生成不支持所有功能的稀疏矩阵输入。万博1manbetx

生成代码中的稀疏数据类型

在代码生成过程中,代码生成器为调用的稀疏矩阵创建类型定义coder_internal_sparse.。此定义存储行指数,列索引和稀疏矩阵的相应元素值阵列。类型定义是在文件中生成的myFunction_types.hmyFunction是指顶级函数的名称。

稀疏矩阵中的非零元素的数量可以在计算期间改变。因此,生成的代码中的稀疏矩阵使用可变大小阵列和动态内存分配。动态分配的变量使用emxArray类型,也定义在myFunction_types

例如,考虑该功能mydiag.:

功能出= mydiag(n,k)%创建对角稀疏矩阵% # codegena = speye(n);出= A. * K;结束

函数生成代码codegen命令:

codegen-config:libmydiag.arg游戏{3、5}-launchreport

可以在文件中找到稀疏类型myDiag_types.h

输入定义

假设你有一个函数喷火接受稀疏矩阵作为输入。此功能将稀疏矩阵乘以身份矩阵并输出产品:

功能c = foo(asparseinput)% # codegenB = speye(大小(ASparseInput '));C = ASparseInput * B;

假设您想要单独生成自由,dll,或exeMATLAB外部使用的代码®环境。生成自由代码,输入:

codegen-config:lib喷火arg游戏{稀疏(5,5)}-launchreport

您可以通过构建入口点函数内的稀疏矩阵而不是将稀疏矩阵作为输入传递稀疏矩阵来简化您的独立代码。遵循此指南时,可以将稀疏矩阵的构建推迟到代码生成器。使用生成代码的其他代码可以通过输入类型,例如阵列,而不是专门的稀疏类型。

例如,而不是直接生成代码喷火,创建一个新的入口点函数fooMain生成代码。用三联形式的稀疏数据替换稀疏输入。

功能[II,JJ,OUT] = Foomain(I,J,V,M,N)% # codegenS =稀疏(i, j, v, m, n);[ii, jj] =找到(foo (S));

假设您想生成一个5 × 5稀疏矩阵的代码年代具有可变大小的非零元素数。要生成代码,请输入:

s =稀疏(5,5);[m,n] =尺寸;[I,J,V] =查找;i = coder.typeof(i,[INF 1]);codegen-config:libfooMainarg游戏{我,我,我,m, n}-launchreport

可以指定的输入fooMain使用整型和可变大小的数组类型。如果您直接从喷火,必须将输入构建为一个coder_internal_sparse.类型。

如果您选择将稀疏矩阵传递为入口点功能输入,则可以使用Coder.typeof.初始化输入。例如,对于函数喷火,您可以输入:

t = coder.typeof(稀疏(5,5));codegen-config:lib喷火arg游戏{t}-launchreport

对于稀疏矩阵,代码生成器不跟踪可变尺寸的上界。所有可变尺寸都被视为无界尺寸。

如果您为…生成一个MEX函数喷火,输入和输出数据必须转换为coder_internal_sparse.。这种转换会降低重复调用MEX函数或大量输入和输出的性能。

不能通过使用以编程方式定义稀疏输入类型断言陈述。

代码生成指南

使用稀疏构造函数初始化矩阵以最大化您的代码效率。例如,要构建一个3×3身份矩阵,使用speye (3)而不是稀疏(眼睛(3))

对稀疏矩阵的索引赋值与对完整矩阵的索引赋值相比会产生开销。例如:

S = speye (10);(7) = 42;

在MATLAB中,稀疏矩阵以压缩稀疏列格式存储。当你在稀疏矩阵中插入一个新的非零元素时,所有后续的非零元素必须逐列向下移动。这些额外的操作会降低性能。

代码生成限制

要生成使用稀疏矩阵的代码,必须启用动态内存分配。为了存储不断变化的非零元素数量及其值,稀疏矩阵在生成的代码中使用可变大小的数组。若要更改动态内存分配设置,请参见控制可变大小数组的内存分配。因为稀疏矩阵使用可变大小的数组来动态分配内存,所以限制适应数据也适用于稀疏矩阵。

您不能将稀疏数据分配给非稀疏的数据。生成的代码对稀疏矩阵和完整矩阵使用不同的数据类型表示。要在稀疏数据之间进行转换,请使用显式稀疏的完整的转换功能。

您不能定义具有竞争性大小规范的稀疏矩阵。代码生成器在生成C/ c++中相应的数据类型定义时,固定稀疏矩阵的大小。例如,函数喷火导致代码生成错误:

功能y = foo (n)% # codegen如果n> 0 y =稀疏(3,2);其他的Y =稀疏(4,3);结束

对于代码生成,不支持对稀疏矩阵进行逻辑索引。万博1manbetx例如,这个语法会导致一个错误:

s =魔术(3);s(s> 7)= 42;

对于稀疏矩阵,你不能通过赋值空数组来删除数组元素:

(:, 2) = [];

另请参阅

|||||

相关话题