0

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

我已经使用 DenseMatrix 类从二维数组创建 n*n 矩阵...但我的问题是如何创建行向量...

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

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

请帮助

4

2 回答 2

4

该类CompRowMatrix并不是真正打算用作行向量,而是用于以一种易于逐行迭代矩阵元素的方式表示稀疏矩阵。

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

相反,使用一个DenseVector对象来保存您的行向量并使用界面中的mult方法。Matrix它接受两个Vector对象作为参数并产生一个向量矩阵乘积。在与以下参数相乘的矩阵对象上调用该方法:

  • 第一个参数, x, 是要与矩阵相乘的向量
  • 第二个参数, y, 保存乘法的结果

因此,要生成向量矩阵乘积y = x*A(其中xy都是1xn行向量并且Anxn矩阵),您可以执行以下操作:

// 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,但我确实发现了它与当前源代码之间的一些差异。

于 2014-03-05T23:01:05.053 回答
2

如果我理解您的问题,一种解决方案是创建一个包含一行和 n 列的矩阵来预乘 nxn 矩阵。有乘法向量的例程,但我相信它们都有向量后乘矩阵。如果您想改用这些例程,则必须进行适当的转置。

于 2011-09-27T15:21:09.240 回答