在 EJML 中将矩阵转换回数组
Convert matrix back to array in EJML
我已经开始使用 EJML 库来表示矩阵。我会用SimpleMatrix
。我没有找到我需要的两件重要的东西。也许有人可以帮助我确定是否可以进行以下操作,如果可以,如何完成:
是否可以将矩阵转换回一维双精度数组(double[]
)或二维双精度数组(double[][]
)而不只是循环遍历所有元素效率很低?我没有找到方法。例如,Jeigen 库提供了到一维数组的转换(但我不知道这是如何在内部完成的)。
是否可以删除行或列?
顺便问一下,有人知道 EJML 与 Jeigen 在运行时方面的大型矩阵相比如何吗? EJML 提供了更多的功能并且有更好的文档记录,但我对运行时有点担心。
一个SimpleMatrix
的底层数组(它总是一维的,以保持RAM中同一区域的所有元素)可以通过首先获取底层DenseMatrix64F
来检索然后获取 public data
字段 D1Matrix64F
base class
// where matrix is a SimpleMatrix
double[] data = matrix.getMatrix().data;
我没有看到删除任意行、列的直接方法。一种解决方法是使用 extractMatrix
(它复制底层 double[]
)来获取原始矩阵的 2 个部分,然后将它们 combine
到一个新矩阵。例如。删除这个 2x3 矩阵的中间列:
SimpleMatrix fullMatrix = new SimpleMatrix(new double[][]{{2, 3, 4}, {7, 8, 9}});
SimpleMatrix a = fullMatrix.extractMatrix(0, 2, 0, 1);
SimpleMatrix b = fullMatrix.extractMatrix(0, 2, 2, 3);
SimpleMatrix matrix = a.combine(0, 1, b);
或者要专门删除第一列,您可以简单地执行以下操作:
SimpleMatrix matrix = fullMatrix.extractMatrix(0, 2, 1, 3);
或者专门删除最后一列你可以简单地做(不删除,复制底层 data[]
):
matrix.getMatrix().setNumCols(matrix.numCols() - 1);
我将参考 this answer 以了解各种 java 矩阵库的基准/性能。 ejml 的性能对于小矩阵来说非常好,而且对于大小为 100 或更大的矩阵来说,与原生 C/C++ 库(如 Jeigen)支持的库竞争不佳。一如既往,您的里程可能会有所不同。
Manos 对第一个问题的回答对我不起作用。这就是我所做的:
public double[][] matrix2Array(SimpleMatrix matrix) {
double[][] array = new double[matrix.numRows()][matrix.numCols()];
for (int r = 0; r < matrix.numRows(); r++) {
for (int c = 0; c < matrix.numCols(); c++) {
array[r][c] = matrix.get(r, c);
}
}
return array;
}
我不知道它与其他方法的性能相比如何,但它的运行速度足以满足我的需要。
我已经开始使用 EJML 库来表示矩阵。我会用SimpleMatrix
。我没有找到我需要的两件重要的东西。也许有人可以帮助我确定是否可以进行以下操作,如果可以,如何完成:
是否可以将矩阵转换回一维双精度数组(
double[]
)或二维双精度数组(double[][]
)而不只是循环遍历所有元素效率很低?我没有找到方法。例如,Jeigen 库提供了到一维数组的转换(但我不知道这是如何在内部完成的)。是否可以删除行或列?
顺便问一下,有人知道 EJML 与 Jeigen 在运行时方面的大型矩阵相比如何吗? EJML 提供了更多的功能并且有更好的文档记录,但我对运行时有点担心。
一个
SimpleMatrix
的底层数组(它总是一维的,以保持RAM中同一区域的所有元素)可以通过首先获取底层DenseMatrix64F
来检索然后获取 publicdata
字段D1Matrix64F
base class// where matrix is a SimpleMatrix double[] data = matrix.getMatrix().data;
我没有看到删除任意行、列的直接方法。一种解决方法是使用
extractMatrix
(它复制底层double[]
)来获取原始矩阵的 2 个部分,然后将它们combine
到一个新矩阵。例如。删除这个 2x3 矩阵的中间列:SimpleMatrix fullMatrix = new SimpleMatrix(new double[][]{{2, 3, 4}, {7, 8, 9}}); SimpleMatrix a = fullMatrix.extractMatrix(0, 2, 0, 1); SimpleMatrix b = fullMatrix.extractMatrix(0, 2, 2, 3); SimpleMatrix matrix = a.combine(0, 1, b);
或者要专门删除第一列,您可以简单地执行以下操作:
SimpleMatrix matrix = fullMatrix.extractMatrix(0, 2, 1, 3);
或者专门删除最后一列你可以简单地做(不删除,复制底层
data[]
):matrix.getMatrix().setNumCols(matrix.numCols() - 1);
我将参考 this answer 以了解各种 java 矩阵库的基准/性能。 ejml 的性能对于小矩阵来说非常好,而且对于大小为 100 或更大的矩阵来说,与原生 C/C++ 库(如 Jeigen)支持的库竞争不佳。一如既往,您的里程可能会有所不同。
Manos 对第一个问题的回答对我不起作用。这就是我所做的:
public double[][] matrix2Array(SimpleMatrix matrix) {
double[][] array = new double[matrix.numRows()][matrix.numCols()];
for (int r = 0; r < matrix.numRows(); r++) {
for (int c = 0; c < matrix.numCols(); c++) {
array[r][c] = matrix.get(r, c);
}
}
return array;
}
我不知道它与其他方法的性能相比如何,但它的运行速度足以满足我的需要。