在 EJML 中将矩阵转换回数组



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

  1. 是否可以将矩阵转换回一维双数组(double[](或二维双数组(double[][](,而不只是循环遍历所有效率非常低下的元素?我没有找到一种方法。例如,Jeigen 库提供了到 1D 数组的转换(但我不知道内部是如何完成的(。

  2. 是否可以删除行或列?

顺便问一下,有人知道EJML在运行时方面与大型矩阵的Jeigen相比如何吗?EJML提供了更多的功能,并且有更好的文档记录,但我在运行时方面有点害怕。

  1. 可以通过首先获取底层DenseMatrix64F然后获取基类的公共data字段来检索SimpleMatrix的底层数组(将所有元素保持在RAM中的同一区域中始终是一维的(D1Matrix64F

    // where matrix is a SimpleMatrix
    double[] data = matrix.getMatrix().data;
    
  2. 我没有看到删除任意行、列的直接方法。一种解决方法是使用 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);
    
  3. 我将参考这个答案来了解各种 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;
}

我不知道它与其他方法的性能相比如何,但它的工作速度足以满足我的需要。

最新更新