CompRowMatrix 类并不是真正打算用作行向量,而是用于表示稀疏矩阵,以便于逐行迭代矩阵元素。
虽然可以通过将除第 1 行以外的所有行设置为零来将 CompRowMatrix 用作向量,但这对程序员来说更复杂,并且对于必须假设其他行可能的代码效率较低变为非零。
改为使用DenseVector 对象来保存行向量,并使用Matrix 接口中的mult 方法。它接受两个Vector 对象作为参数并产生一个向量矩阵乘积。该方法在与以下参数相乘的矩阵对象上调用:
- 第一个参数
x 是您要与矩阵相乘的向量
- 第二个参数,
y,保存乘法的结果
所以要生成向量矩阵乘积y = x*A(其中x 和y 都是1xnrow 向量,A 是nxn 矩阵),你会做这样的事情:
// create matrix A
double[][] matValues = new double[n][n];
... // initialize values of the matrix
Matrix A = new DenseMatrix(matValues);
// create vector x
double[] vecValues = new double[n];
... // initialize values of the vector
Vector x = new DenseVector(vecValues);
// create vector y to store result of multiplication
Vector y = new DenseVector(n);
// perform multiplication
A.mult(x, y);
现在您可以根据需要在其余代码中使用y。在乘法之前分配y 很重要,但这与它保存的数据无关。 mult 方法将在退出时覆盖 y 中的任何内容。
另外请注意,我选择初始化x 和A 的方法并不是唯一可用的方法。例如,上面的代码在构造相应的Vector 和Matrix 对象时,会自动深度复制数组vecValues 和matValues。如果您不打算将数组用于任何其他目的,那么您可能不应该执行此深层复制。您可以通过在构造函数中传递一个设置为 false 的额外布尔参数来做到这一点,例如
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
您应该参考您和我之前链接到的 javadoc 以获得更多构造函数选项。但是请注意,上述 javadoc 是针对与当前版本的 MTJ 不同的版本(截至本文发布时的版本 1.01)。我不知道它适用于哪个版本,也无法找到当前版本的 javadoc,但我确实发现了它与 current source code 之间的一些差异。