在EJML中将矩阵转换回数组

时间:2016-02-10 00:09:34

标签: java matrix ejml

我已经开始使用EJML库来表示矩阵。我将使用SimpleMatrix。我没有找到我需要的两件重要事情。也许有人可以帮我确定以下操作是否可行,如果是,可以如何做到这一点:

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

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

  3. 顺便说一下,有人知道EJML在运行时方面与大型矩阵的Jeigen相比如何? EJML提供了更多功能,并且记录得更好,但我在运行时方面有点担心。

2 个答案:

答案 0 :(得分:1)

  1. 首先获取基础SimpleMatrix然后获取,DenseMatrix64F的基础数组(它始终是一维的,以便将所有元素保存在RAM中的同一区域中) data基类的公共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. 我将参考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;
}

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