0

我正在从事一个需要为 74000 X 640 维度的矩阵获取 SVD(单值分解)的项目。我尝试了这三个库:Jama、高效的 Java Matrix 库 (EJML) 和 OjAlgo。我根据 SVD 中的 Java Matrix 基准内存结果选择这三个库。起初我使用 Jama,但后来我发现行数必须 >= 列数,我需要在另一个步骤中获取任何矩阵维度的 SVD。所以,我搬到了 EJML 和 OjAlgo,但我对 EJML 有一些疑问/问题:

EJML--> 它为 SVD 提供了正确的结果,但是当我将矩阵大小扩大到 74000 X 640 维度时,它给了我堆内存异常,那么库的矩阵大小是否有限制?

这是我用于创建矩阵的代码:

 SimpleMatrix A = new SimpleMatrix(74000, 640);

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

谢谢

4

2 回答 2

0

JVM 堆的大小是多少?假设双精度数字,密集排列,您的 74000 X 640 矩阵将占用大约 361Mb 的 RAM。我想计算 SVD 的工作记忆至少又是这样。所以很可能库中没有内存限制,只是你使用了很多,而 JVM 没有足够的堆空间来运行你的计算。

于 2012-06-26T19:12:03.680 回答
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);

谢谢..

于 2012-06-27T04:48:05.900 回答