Java矩阵库中的问题

时间:2012-06-26 19:07:55

标签: java matrix svd jama

我正在开展一个项目,需要为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);

请帮助我理解并解决我的问题。

谢谢

2 个答案:

答案 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);

谢谢..