0

私は、74000 X 640次元の行列のSVD(単一値分解)を取得する必要があるプロジェクトで作業しています。Jama、効率的なJava Matrixライブラリ(EJML)、およびOjAlgoの3つのライブラリを試しました。SVDでのJava Matrixベンチマークメモリの結果に基づいて、これら3つを選択します。最初はJamaを使用しましたが、行数は列数以上でなければならず、別のステップで任意の行列次元のSVDを取得する必要があることを発見しました。そこで、EJMLとOjAlgoに移動しましたが、EJMLにいくつか質問/問題があります。

EJML-> SVDに対して正しい結果が得られますが、マトリックスサイズを74000 X 640次元に拡大すると、ヒープメモリの例外が発生するため、ライブラリのマトリックスサイズに制限がありますか?

マトリックスの作成に使用したコードは次のとおりです。

 SimpleMatrix A = new SimpleMatrix(74000, 640);

私の問題を理解して修正するのを手伝ってください。

ありがとうございました

4

2 に答える 2

0

申し訳ありませんが、OjAlgoの問題を修正するには、コードを1行追加します(関数compute)。コードは次のようになります。

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 に答える
0

JVMヒープのサイズはどれくらいですか?倍精度の数値を密に詰め込んだとすると、74000X640のマトリックスは約361MbのRAMを使用します。SVDを計算するための作業メモリーは、少なくともこれも同じだと思います。したがって、ライブラリにメモリ制限がない可能性がありますが、ライブラリを大量に使用していて、JVMに計算を実行するための十分なヒープスペースがないだけです。

于 2012-06-26T19:12:03.680 に答える