1

私はここで何が間違っているのですか?Coltを使用して2つのスパース行列を要素ごとに乗算したいと思います。これが私がこれを行おうとしている方法の例です:

DoubleMatrix2D A = new SparseDoubleMatrix2D(2, 2);
A.set(0, 0, 2.0);

DoubleMatrix2D B = new SparseDoubleMatrix2D(2, 2);
B.set(0, 0, 3.0);

A.assign(B, Functions.mult);

左上の要素が6の行列の期待される結果の代わりに、次のようになります。

2 x 2 matrix
18 0
0 0

AをDenseDoubleMatrix2Dに変更すると、正しい結果が得られます。BをDenseDoubleMatrix2Dに変更しても、結果は変更されません。この方法で2つのベクトルを要素ごとに乗算すると、SparseDoubleMatrix1DとDenseDoubleMatrix1Dのどちらを使用したかに関係なく、常に正しい結果が得られました。

4

1 に答える 1

2

「割り当て」はオブジェクトを変更するため、2 回使用した可能性があります。
たとえばParallel Colt 0.10.0、Scala REPL を使用した次のコードを参照してください。

scala> import cern.colt.matrix.tdouble._
import cern.colt.matrix.tdouble._

scala> import cern.jet.math.tdouble.DoubleFunctions
import cern.jet.math.tdouble.DoubleFunctions

scala> val A = new SparseDoubleMatrix2D(2, 2);
A: cern.colt.matrix.tdouble.impl.SparseDoubleMatrix2D = 
2 x 2 sparse matrix, nnz = 0


scala> A.set(0, 0, 2.0)

scala> val B = new SparseDoubleMatrix2D(2, 2);
B: cern.colt.matrix.tdouble.impl.SparseDoubleMatrix2D = 
2 x 2 sparse matrix, nnz = 0


scala> B.set(0, 0, 3.0)

scala> A.assign(B, DoubleFunctions.mult)
res11: cern.colt.matrix.tdouble.DoubleMatrix2D = 
2 x 2 sparse matrix, nnz = 1
(0,0)   6.0


scala> A.assign(B, DoubleFunctions.mult)
res12: cern.colt.matrix.tdouble.DoubleMatrix2D = 
2 x 2 sparse matrix, nnz = 1
(0,0)   18.0


scala> A.assign(B, DoubleFunctions.mult)
res13: cern.colt.matrix.tdouble.DoubleMatrix2D = 
2 x 2 sparse matrix, nnz = 1
(0,0)   54.0

または、使用している Colt の別のバージョンのバグである可能性があります。

于 2012-09-21T21:43:46.363 に答える