我正在开展一个项目,需要为74000 X 640维度的矩阵获得SVD(单值分解)。我尝试了这三个库:Jama,高效Java矩阵库(EJML)和OjAlgo.I根据SVD中的Java Matrix基准内存结果选择这三个库。起初我使用了Jama但我发现行数必须> =列数,我需要在另一步中获得任何矩阵尺寸的SVD。所以,我转到EJML和OjAlgo,但我对EJML有一些疑问/问题:
EJML - >它为SVD提供了正确的结果,但是当我将矩阵大小放大到74000 X 640维度时,它给出了堆内存异常,因此对库的矩阵大小有限制吗?
这是我用于创建Matrix的代码:
SimpleMatrix A = new SimpleMatrix(74000, 640);
请帮助我理解并解决我的问题。
谢谢
答案 0 :(得分:0)
JVM堆的大小是多少?假设双精度数字密集,您的74000 X 640矩阵将占用~361Mb的RAM。我想用于计算SVD的工作记忆至少是这个。所以很可能是库中没有内存限制,只是你使用了很多内存并且JVM没有足够的堆空间来运行你的计算。
答案 1 :(得分:0)
很抱歉,我通过添加一行代码(函数计算)解决了OjAlgo的问题,代码现在看起来像:
MatrixFactory<?> tmpFactory = PrimitiveMatrix.FACTORY;
double[][] tmpData = new double[][] {{1,2,3,4,5},{11,12,18,19,25},{89,75,14,21,26},{33,24,47,15,49}};
BasicMatrix tmpH = tmpFactory.rows(tmpData);
Access2D<Double> j = (Access2D<Double>)tmpH;
SingularValue f = SingularValueDecomposition.make(j);
f.compute(j);
谢谢..