我已经开始使用EJML库来表示矩阵。我将使用SimpleMatrix
。我没有找到我需要的两件重要事情。也许有人可以帮我确定以下操作是否可行,如果是,可以如何做到这一点:
是否可以将矩阵转换回1D双数组(double[]
)或2D双数组(double[][]
)而不仅仅循环遍历所有非常低效的元素?我没有找到方法。例如,Jeigen库提供了对一维数组的转换(但我不知道这是如何在内部完成的)。
是否可以删除行或列?
顺便说一下,有人知道EJML在运行时方面与大型矩阵的Jeigen相比如何? EJML提供了更多功能,并且记录得更好,但我在运行时方面有点担心。
答案 0 :(得分:1)
首先获取基础SimpleMatrix
然后获取,DenseMatrix64F
的基础数组(它始终是一维的,以便将所有元素保存在RAM中的同一区域中) data
基类的公共D1Matrix64F
字段
// 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)支持的库不能很好地竞争。与往常一样,您的里程可能会有所不同。
答案 1 :(得分:0)
马诺斯对第一个问题的回答对我没有用。这是我所做的:
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;
}
我不知道它在性能上与其他方法相比如何,但是它可以足够快地满足我的需求。