优化RAM成本只存储对称矩阵的上三角部分?

16次浏览(过去30天)
你好,
我有一些对称(几乎密集)的矩阵,我希望只存储上三角部分,这样我就可以优化RAM的使用。我用MATLAB做了一些实验:
>> testa = rand(1000);
> > vsize(外种皮)
% -------------------------
% 8000000 8000000 B * testa = 2:1000x1000:double
>> testb = triu(testa);
>> testb =稀疏(testb);
> > vsize(的)
% -------------------------
% 8016008 8016008 B * testb = 2:10 000x1000:double.sparse . xml
我们可以看到,经过triu和sparse之后,储存量甚至增加了。我知道当存储稀疏矩阵时,每个条目花费8字节,存储x-y坐标花费8+8 = 16字节,所以每个条目花费3*8 = 24字节,现在在testb中只存储了一半的元素,因此成本应该是24 * 1000 * 1000 / 2 = 12000000字节,那么为什么在这种情况下它是8016008字节?
有没有一种方法,比如我告诉MATLAB矩阵是对称的,所以我只存储一半的元素,但不存储x-y坐标,这样内存消耗正好是稠密矩阵的一半?
谢谢!

答案(2)

1月
1月 2017年6月21日
编辑:1月 2021年4月24日
没有办法告诉Matlab一个矩阵是对称的。只有当矩阵真的稀疏且大多数元素为0时,稀疏矩阵才有用。对于存储三角矩阵,情况就不一样了。
一些BLAS和LAPACK函数对于对称输入更有效。如果你想利用这一点,你需要在MEX级别上访问它们。与Matlab编程相比,这并不容易,而且容易出现错误。最好的解决方案是使用完整的矩阵并安装更多的RAM。如果额外的4GB就足够了,这将是一个非常有效的投资。
PS.我没有从内存行业得到任何财政支持。万博1manbetx我学习了在1kB的ZX81上编程,并通过将数字存储为字符来压缩源代码中的字节。后来,我遇到了最大容量为256kB的机器,然后是192MB的笔记本电脑,以及几乎全功能的1GB WinXP机器。我在痛苦的过程中学会了:没有什么能打败真正的RAM。
[EDITED, 2017-06-24 21:08 UTC]如果你能以紧凑的格式存储矩阵,那么所有使用矩阵的函数都必须进行调整。没有运算符可以工作,无论是标准代数还是优化的BLAS和LAPACK库,例如用于矩阵乘法和矩阵方程的求解器。因此,我怀疑节省内存是否有用。

大卫Goodmanson
大卫Goodmanson 2017年6月24日
你好,Xh Du,
这样做的好处是,如果你有几个相同大小的上三角形方阵,你可以有效地将它们存储在一个矩形矩阵中:
函数R = tris2r(a,b)
%节省两个正方形上三角矩阵a和b,每个大小为n × n
%表示大小为(n+1) xn的矩形矩阵r。
'a'的%对角元素包含在r的最后一行。
N = size(a,1);
diag = diag(a).';%行向量
A (1:(n+1):n²)= 0;将'a'的主diag归零
R = [a.'+b;adiag];
结束
函数[a b] = r2tris(r)
%转换大小为(n+1) * n的矩形矩阵r
%到两个大小为n × n的上三角形方阵a和b。
'a'的%对角元素包含在r的最后一行。
N = size(r,2);
Adiag = r(end,:);
R (end,:) = [];
B = triu(r);
A = tril(r).';
A (1:(n+1):n²)= adiag;插入'a'的对角线
结束
通过更多的工作和计算,您可以将单个上三角矩阵存储在一个大小为(n+1) x (n/2)的矩形矩阵中,对于n个偶数,n个奇数,n个x (n+1)/2。

类别

了解更多线性代数帮助中心而且文件交换

社区寻宝

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

开始狩猎!