Поэлементное умножение разреженных матриц с использованием Кольта
Что я здесь не так делаю? Я хочу поэлементно умножить две разреженные матрицы, используя Colt. Вот пример того, как я пытаюсь сделать это:
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 не меняет результат. Поэлементное умножение двух векторов таким способом всегда давало правильные результаты, независимо от того, использовал ли я SparseDoubleMatrix1D или DenseDoubleMatrix1D.
1 ответ
"assign" изменяет объект, поэтому вы могли использовать его дважды.
Например, смотрите следующий код, используя 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, которую вы используете.