我需要实现一个乘法公式,其中大小为'n'的行矩阵乘以n * n矩阵。
我使用DenseMatrix类从2D数组创建n * n矩阵......但我的问题是如何创建一行Vector ...
我可以使用CompRowMatrix类来创建一个行矩阵......但是为此,输入必须是'Matrix'..但是Matrix是一个接口......无法实例化它...... {{的第一个构造函数3}}状态它需要一个'非零索引数组'作为输入..但是我无法理解这个非零索引数组是什么?
另外,我可以使用 CompRowMatrix class 或任何其他合适的类创建一个向量。但似乎没有方法可以直接将向量与矩阵相乘..
plz help
答案 0 :(得分:4)
CompRowMatrix
类实际上并不打算用作行向量,而是用于表示稀疏矩阵,以便逐行迭代矩阵元素。
虽然可以通过将除第1行以外的所有行设置为零来使用CompRowMatrix
作为向量,但对于作为程序员而言,这对于您来说更复杂,而对于必须假设其他行的代码来说效率较低可能会变为非零。
而是使用DenseVector
对象来保存行向量,并使用Matrix
接口中的mult方法。它接受两个Vector
个对象作为参数,并生成一个矢量矩阵乘积。在矩阵对象上调用该方法乘以以下参数:
x
,是您想要与矩阵相乘的矢量y
,保存乘法的结果生成向量矩阵乘积y = x*A
(其中x
和y
都是1
x n
行向量和A
是一个n
x n
矩阵,您可以这样做:
// 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
和matValues
对象时会自动深度复制数组Vector
和Matrix
。如果您不打算将数组用于任何其他目的,那么您可能不应该执行此深层复制。您可以通过在构造函数中将额外的布尔参数设置为false来执行此操作,例如
// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);
您应该引用您和我之前链接的javadoc以获取更多构造函数选项。但请注意,javadoc表示与当前版本的MTJ(截至本文发布时的版本1.01)不同的版本。我不知道它的版本是什么,也没有找到当前版本的javadoc,但我发现它与current source code之间存在一些差异。
答案 1 :(得分:2)
如果我理解你的问题,一个解决方案是创建一个包含一行和n列的矩阵,以预乘n x n矩阵。有一些用于乘法向量的例程,但我相信它们都有向后乘以矩阵的向量。如果您想要使用这些例程,则必须进行相应的转置。