我想在我的代码中执行简单的矩阵运算,我使用 Colt 库
(见这里:http://acs.lbl.gov/software/colt/api/index.html)
例如,我想加/减/乘矩阵,将标量加/减/乘/除到矩阵的每个单元格等......但是这个库中似乎没有这样的函数。
但是,我发现了以下评论:https://stackoverflow.com/a/10815643/2866701
如何使用 assign() 命令在我的代码中执行这些简单的操作?
Colt 在 assign()
方法下提供了一个更通用的框架。例如,如果要向矩阵的每个单元格添加标量,可以执行以下操作:
double scalar_to_add = 0.5;
DoubleMatrix2D matrix = new DenseDoubleMatrix2D(10, 10); // creates an empty 10x10 matrix
matrix.assign(DoubleFunctions.plus(scalar_to_add)); // adds the scalar to each cell
标准函数在 DoubleFunctions
类中可用作静态方法。其他需要由您编写。
如果你想要向量加法而不仅仅是添加一个标量值,assign()
的第二个参数需要是一个DoubleDoubleFunction
。例如
DoubleDoubleFunction plus = new DoubleDoubleFunction() {
public double apply(double a, double b) { return a+b; }
};
DoubleMatrix1D aVector = ... // some vector
DoubleMatrix1D anotherVector = ... // another vector of same size
aVector.assign(anotherVector, plus); // now you have the vector sum
你为什么不试试la4j(Java的线性代数)?它易于使用:
Matrix a = new Basci2DMatrix(new double[][]{
{ 1.0, 2.0 },
{ 3.0, 4.0 }
});
Matrix b = new Basci2DMatrix(new double[][]{
{ 5.0, 6.0 },
{ 7.0, 8.0 }
});
Matrix c = a.multiply(b); // a * b
Matrix d = a.add(b); // a + b
Matrix e = a.subtract(b); // a - b
还有transform()
方法类似于柯尔特assign()
。它可以按如下方式使用:
Matrix f = a.transform(Matrices.INC_MATRIX); // inreases each cell by 1
Matrix g = a.transform(Matrices.asDivFunction(2)); // divides each cell by 2
// you can define your own function
Matrix h = a.transform(new MatrixFunction {
public double evaluate(int i, int j, int value) {
return value * Math.sqrt(i + j);
}
});
但它仅适用于 2D 矩阵。