我需要实现一个乘法公式,其中一个大小为'n‘的行矩阵要乘以一个n*n矩阵。
我已经使用DenseMatrix类从2D array...but创建了n*n矩阵我的问题是如何创建一个行向量...
我可以使用CompRowMatrix类为它创建一个行矩阵,输入必须是‘matrix...but’..但是矩阵是一个接口..无法实例化 CompRowMatrix class 状态的第一个构造函数它需要一个‘非零索引数组’因为input..but我无法理解这个非零索引数组是什么??
另外,我可以用 DenseVector 或任何其他合适的class..but来创建一个向量,似乎没有一种方法可以将一个向量与一个矩阵直接相乘。
请帮助
发布于 2014-03-06 07:01:05
CompRowMatrix类实际上并不打算用作行向量,而是用来表示稀疏矩阵,这样就可以很容易地逐行迭代矩阵元素。
虽然可以通过将第一行以外的所有行都设置为0来使用CompRowMatrix作为向量,但对于程序员来说,这会更加复杂,并且对于必须假设其他行可能变为非零的代码来说,效率会更低。
相反,可以使用DenseVector对象来保存行向量,并使用Matrix接口中的mult方法。它接受两个Vector对象作为参数,并生成一个向量矩阵乘积。在与以下参数相乘的矩阵对象上调用该方法:
x是要与矩阵相乘的向量y,保存multiplication的结果
因此,要生成向量矩阵乘积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的方法并不是唯一可用的方法。例如,上面的代码在构造相应的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之间的一些差异。
发布于 2011-09-27 23:21:09
如果我理解你的问题,一种解决方案是创建一个一行n列的矩阵来预乘n x n矩阵。有一些用于向量乘法的例程,但我相信它们都有对矩阵进行后乘法的向量。如果您希望使用这些例程,则必须进行适当的转置。
https://stackoverflow.com/questions/5820296
复制相似问题