该类CompRowMatrix并不是真正打算用作行向量,而是用于以一种易于逐行迭代矩阵元素的方式表示稀疏矩阵。
虽然可以CompRowMatrix通过将除第一行以外的所有行设置为零来用作向量,但这对程序员来说更复杂,并且对于必须假设其他行可能变为非零的代码来说效率较低。
相反,使用一个DenseVector对象来保存您的行向量并使用界面中的mult方法。Matrix它接受两个Vector对象作为参数并产生一个向量矩阵乘积。在与以下参数相乘的矩阵对象上调用该方法:
- 第一个参数,
x, 是要与矩阵相乘的向量
- 第二个参数,
y, 保存乘法的结果
因此,要生成向量矩阵乘积y = x*A(其中x和y都是1xn行向量并且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并不是唯一可用的方式。例如,上面的代码在构造对应的 和 对象时会自动深度复制数组和vecValues对象。如果您不打算将数组用于任何其他目的,那么您可能不应该执行此深层复制。您可以通过在构造函数中传递一个额外的布尔参数设置为 false 来做到这一点,例如matValuesVectorMatrix
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
您应该参考您和我之前链接到的 javadoc 以获得更多构造函数选项。但是请注意,上述 javadoc 是针对与当前版本的 MTJ 不同的版本(截至本文发布时的版本 1.01)。我不知道它适用于哪个版本,也无法找到当前版本的 javadoc,但我确实发现了它与当前源代码之间的一些差异。