在java矩阵工具包(MTJ)中创建行向量

时间:2011-04-28 14:34:40

标签: java vector matrix-multiplication mtj

我需要实现一个乘法公式,其中大小为'n'的行矩阵乘以n * n矩阵。

我使用DenseMatrix类从2D数组创建n * n矩阵......但我的问题是如何创建一行Vector ...

我可以使用CompRowMatrix类来创建一个行矩阵......但是为此,输入必须是'Matrix'..但是Matrix是一个接口......无法实例化它...... {{的第一个构造函数3}}状态它需要一个'非零索引数组'作为输入..但是我无法理解这个非零索引数组是什么?

另外,我可以使用 CompRowMatrix class 或任何其他合适的类创建一个向量。但似乎没有方法可以直接将向量与矩阵相乘..

plz help

2 个答案:

答案 0 :(得分:4)

CompRowMatrix类实际上并不打算用作行向量,而是用于表示稀疏矩阵,以便逐行迭代矩阵元素。

虽然可以通过将除第1行以外的所有行设置为零来使用CompRowMatrix作为向量,但对于作为程序员而言,这对于您来说更复杂,而对于必须假设其他行的代码来说效率较低可能会变为非零。

而是使用DenseVector对象来保存行向量,并使用Matrix接口中的mult方法。它接受两个Vector个对象作为参数,并生成一个矢量矩阵乘积。在矩阵对象上调用该方法乘以以下参数:

  • 1st arg,x,是您想要与矩阵相乘的矢量
  • 2nd arg,y,保存乘法的结果

生成向量矩阵乘积y = x*A(其中xy都是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中的任何内容。

另请注意,我选择初始化xA的方式并非唯一可用的方法。例如,上面的代码在构造相应的vecValuesmatValues对象时会自动深度复制数组VectorMatrix。如果您不打算将数组用于任何其他目的,那么您可能不应该执行此深层复制。您可以通过在构造函数中将额外的布尔参数设置为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矩阵。有一些用于乘法向量的例程,但我相信它们都有向后乘以矩阵的向量。如果您想要使用这些例程,则必须进行相应的转置。