包装

以一半的密集内存消耗存储和操作对称矩阵

565下载

更新2014年1月9日

查看许可协议

如果您在操作对称矩阵时遇到“内存不足”错误,请继续阅读。(使用说明在底部。)

我应该提前说,线性代数要慢得多(与全存储相比),因为众所周知,对于打包存储缺乏三级BLAS操作;在出现“内存不足”错误之前,由您来判断是否值得为解决更大的系统而付出这样的代价。

以打包格式存储的对称矩阵只占用(大约)全部存储所需内存的一半;此外,以元素为单位的算术运算只在矩阵的非冗余的下三角形或上三角形部分上执行,并且矩阵转置等操作的代价为零。

此包为Matlab添加了对打包格式存金宝app储的矩阵的支持。它为创建和访问这样的矩阵提供了一个接口。此外,它扩展了一个名为trilin的包,用于线性代数(因式分解、线性系统的解、反演和条件数估计)的打包存储。(请注意,trilin不实现线性代数算法,只公开LAPACK算法。如果你想分解一个矩阵一次,然后重复使用它的结果多次,它是有用的;例如,在线性最小二乘问题A * x = b + r中,使用A的相同因式分解来求解线性系统x = A'*A \ A'b,以获得后验协方差矩阵C = inv(A'*A),并估计其条件。)

我尽量遵循Matlab中稀疏矩阵的设计和实现(Gilbert et al., 1992)。更especifically:
如果没有用户的明确指示(即通过类构造函数packs()),不会创建打包的矩阵;
-填充矩阵的运算产生填充矩阵,除非运算符破坏结构(例如,A(1,end) = +1;A(end,1) = -1;破坏了对称);
-对已填充和未填充矩阵的混合运算产生已填充结果,除非运算符破坏了结构;
—操作结果的值不依赖于操作数的存储类,尽管结果的存储类可以;
-为了简单起见,我们拒绝了封装矩阵的可能性,其中所有未显式存储的值都将是某个标量而不是零(在三角形矩阵的情况下或对称矩阵的对称部分)。

已知的限制有:
-访问打包存储矩阵中的单个元素预计将比完全存储的成本更高,因为需要更复杂的索引;
-复杂数据是略微支持的,这意味着你可以创建三角形或对称(但金宝app不是厄米)复杂矩阵,但复杂数据的操作和函数是未定义的;
线性代数明显慢(与全存储相比),因为众所周知的缺乏三级BLAS操作的打包存储在出现“内存不足”错误之前,由您来判断是否值得为解决更大的系统而付出这样的代价。
这个包是在最近发布的矩形全包格式(RFPF;参见Gustavson et al., 2008)。这样的公式是显著的,因为它需要最少的存储,同时比当时现有的打包存储LAPACK例程更有效。如果这里提供的包经过调整,可以在Matlab中提供对RFPF的支持,那就太好了。金宝app

一些技术细节:
—支持的数据类型为金宝app
‘double’,‘single’,……
'int8', 'uint8',…
'int16', 'uint16',…
'int32', 'uint32',…
“逻辑”、“生物炭”
理想情况下,这个包会提供一个新的矩阵存储类(除了已经可用的full和sparse之外,还打包了),而不是一个用户类。也就是说,我已经重载了函数class和isa来计算其数据的类,因此class(packed(single(0))将返回'single',而不是'packed';使用function ispacked来检查,就像使用function issparse一样;
我让@sparse来做尺寸兼容性的错误检查这大大简化了代码;
-这些例程伴随着一个广泛的测试套件,可以通过调用test_pack来运行。

有关打包格式的背景知识,请参阅LAPACK用户指南中的相关章节(特别是“矩阵存储方案”、“打包存储”和“命名方案”章节)。

最后,我必须提一下,我在几年前写了这个包,从那以后就没有使用过它,所以请报告您可能遇到的任何错误。

引用作为

费利佩·g·涅文斯基(2023)。包装(//www.tatmou.com/matlabcentral/fileexchange/44980-packed), MATLAB中央文件交换。检索

MATLAB版本兼容性
使用R2011b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux
确认

启发:lapacktestittrilin

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!
版本 发表 发布说明
1.0.0.0