关于Java:在EJML中将矩阵转换回数组

Convert matrix back to array in EJML

我已经开始使用EJML库来表示矩阵。我将使用SimpleMatrix。我没有找到我需要的两个重要内容。也许有人可以帮助我确定是否可以进行以下操作,如果可以,则如何完成此操作:

  • 是否可以将矩阵转换回一维双精度数组(double[])或二维双精度数组(double[][]),而不必循环遍历所有效率很低的元素?我没有找到解决方法。例如,Jeigen库提供了到一维数组的转换(但是我不知道如何在内部完成)。

  • 是否可以删除行或列?

  • 顺便说一句,有人知道在运行时方面EJML与Jeigen在大型矩阵方面的比较吗? EJML提供了更多功能,并且文档化得更好,但就运行时而言我有点担心。


  • SimpleMatrix的基础数组(将所有元素始终保留在RAM中的同一区域中,始终为一维)可以通过首先获取基础DenseMatrix64F然后获取公共data来进行检索D1Matrix64F基类

    的字段

    1
    2
    // where matrix is a SimpleMatrix
    double[] data = matrix.getMatrix().data;
  • 我看不到删除任意行,列的直接方法。一种解决方法是使用extractMatrix(它复制底层的double[])来获取原始矩阵的2部分,然后将它们combine转换为新的矩阵。例如。删除此2x3矩阵的中间列:

    1
    2
    3
    4
    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);

    或者要专门删除第一列,您可以简单地执行以下操作:

    1
    SimpleMatrix matrix = fullMatrix.extractMatrix(0, 2, 1, 3);

    或者要专门删除最后一列,您可以简单地执行此操作(不删除,复制基础data[]):

    1
    matrix.getMatrix().setNumCols(matrix.numCols() - 1);
  • 对于各种Java矩阵库的基准测试/性能,我将参考此答案。 ejml的性能在小型矩阵中表现出色,并且大小为100或更大的文件与本机C / C库(如Jeigen)支持的库无法很好地竞争。和往常一样,您的里程可能会有所不同。


  • Manos对第一个问题的回答对我不起作用。这是我所做的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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;
    }

    我不知道它在性能上与其他方法相比如何,但是它可以足够快地满足我的需求。