代码生成的稀疏矩阵
稀疏矩阵提供高效存储在内存中对于有许多零的数组元素。稀疏矩阵可以提供改善的性能和减少内存使用生成的代码。在稀疏矩阵尺度上计算时间只与非零元素上的操作的数量。
函数用于创建和操纵稀疏矩阵中列出稀疏矩阵。检查是否支持一个函数代码生成,看到函数引用页面。金宝app代码生成不支持使用创建的稀疏矩阵的输入金宝app稀疏的
对所有功能。
稀疏数据类型生成的代码
如果你的目标语言是C代码生成器创建一个类型定义为稀疏矩阵稀疏的
。这个定义存储数组的行指标,列指标,为稀疏矩阵和相应的元素值。的稀疏的
类型定义生成的文件myFunction_types.h
,在那里myFunction
指的是顶级函数的名称。
如果你的目标语言c++,代码生成器创建一个类稀疏的
在文件中sparse.h
。
非零元素的数量在一个稀疏矩阵在计算过程中可能会发生改变。出于这个原因,稀疏矩阵在生成的代码中使用适应可变数组和动态内存分配。如果你的目标语言是C,生成的代码实现通过使用动态分配的变量emxArray
类型。如果你的目标语言c++,生成的代码实现通过使用动态分配的变量编码器:数组
类模板。
例如,考虑函数myDiag
:
函数= myDiag (n, k)%创建对角稀疏矩阵% # codegen一个= speye (n);= a * k;结束
函数通过使用生成代码codegen
命令:
codegen配置:自由myDiagarg游戏{3、5}-launchreport
稀疏的类型可以在文件中找到myDiag_types.h
。
输入定义
假设您有一个函数喷火
接受一个稀疏矩阵作为输入。这个函数可以增添一个单位矩阵的稀疏矩阵,输出产品:
函数C = foo (ASparseInput)% # codegenB = speye(大小(ASparseInput '));C = ASparseInput * B;
假设您想要生成独立的自由
,dll
,或exe
使用MATLAB之外的代码®环境。生成自由
代码,请输入:
codegen配置:自由喷火arg游戏{稀疏(5,5)}-launchreport
您可以简化你的独立的代码通过构造稀疏矩阵在你的入口点函数,而不是通过稀疏矩阵作为输入。当你遵循这条指导原则,建设稀疏矩阵可以推迟到代码生成器。其他代码,使用生成的代码可以通过输入类型数组而不是专门的稀疏等类型。
例如,而不是直接从生成代码喷火
,创建一个新的入口点函数fooMain
来生成代码。稀疏的输入替换的三联体形式稀疏数据。
函数[ii, jj] = fooMain (i, j, v, m, n)% # codegenS =稀疏(i, j, v, m, n);[ii, jj] =找到(foo (S));
假设您希望5-by-5稀疏矩阵的生成代码年代
适应可变数量的非零元素。来生成代码,请输入:
S =稀疏(5,5);[m, n] =大小(S);(i, j, v) =找到(S);我=编码器。typeof(我,[正1]);codegen配置:自由fooMainarg游戏{我,我,我,m, n}-launchreport
您可以指定的输入fooMain
整数和适应可变数组类型。如果你直接生成代码喷火
,您必须输入作为构造稀疏的
类型。
如果你选择通过稀疏矩阵作为一个入口点函数的输入,您可以使用coder.typeof
初始化输入。例如,对于函数喷火
您可以输入:
t = coder.typeof(稀疏(5,5));codegen配置:自由喷火arg游戏{t}-launchreport
为稀疏矩阵,代码生成器没有跟踪上界为适应维度。所有适应维度被视为无限。
如果您生成一个墨西哥人功能喷火
输入和输出数据必须转换成稀疏的
类型。这种转换可以缓慢重复的墨西哥人的性能函数调用或大的输入和输出。
你不能定义稀疏的输入类型以编程方式使用断言
语句。
代码生成的指导方针
初始化矩阵,利用稀疏的构造函数代码效率最大化。例如,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);结束
逻辑索引为稀疏矩阵不支持代码生成。金宝app例如,这个语法会导致一个错误:
S =魔法(3);(年代> 7)= 42;
为稀疏矩阵,你不能删除数组元素通过分配空数组:
(:,2)= [];
另请参阅
稀疏的
|完整的
|coder.typeof
|魔法
|speye
|codegen