将行追加到矩阵的最佳方法是什么?

时间:2019-05-10 15:40:59

标签: java matrix linear-algebra apache-commons

我正在尝试将行追加到预先存在的矩阵中。我写了一些能达到目的的代码(如下所示),但我不禁感到有一种更好的方法可以做到这一点(或者也许已经有一个Apache Commons函数可以做到这一点?)。

代码

private RealMatrix appendRow(RealMatrix m) {

    double[][] mData = m.getData();
    double[][] newData = new double[m.getRowDimension()+1][m.getColumnDimension()];

    for (int i = 0; i < m.getRowDimension(); i++) {
        newData[i] = mData[i];
    }

    newData[m.getRowDimension()] = new double[m.getColumnDimension()];

    return MatrixUtils.createRealMatrix(newData);
}

用法和输出示例

RealMatrix m = MatrixUtils.createRealMatrix(new double[][]{{1,2,3}, {4,5,6}});
Log.i("m", m.toString());

// Array2DRowRealMatrix{{1.0,2.0,3.0},{4.0,5.0,6.0}}

m = appendRow(m);
Log.i("m", m.toString());

// Array2DRowRealMatrix{{1.0,2.0,3.0},{4.0,5.0,6.0},{0.0,0.0,0.0}}

任何提示都值得赞赏!

3 个答案:

答案 0 :(得分:2)

假设RealMatrix是您的自定义类,则无论如何都需要编写一些代码。有像Apache Commons Lang这样的库,它具有方法ArrayUtils.add(array, new element)(实际上是一堆重载),但是您的代码并不复杂,足以证明为此添加了额外的依赖关系。

一些注意事项:

double[][] newData = new double[m.getRowDimension()+1][m.getColumnDimension()];已经创建了“内部”数组,即行,因此newData[m.getRowDimension()] = new double[m.getColumnDimension()];是不必要的。

还要注意,newData[i] = mData[i];冒着使用同一行的多个矩阵的风险,因此更改一个矩阵也会改变其他矩阵。因此,我建议您使用System.arrayCopy(mData[i], 0, newData[i], 0, mData[i].length )而不是newData[i] = mData[i]进行复制。

为说明最后一点,请尝试RealMatrix m2 = appendRow(m);,然后更改复制的元素之一(例如,将[0] [0]更改为7)并同时打印mm2。 / p>

答案 1 :(得分:0)

您走对了路。我唯一可以添加的就是替换此循环:

if(Rotation > 180)
    Rotation -= 360;

具有:

for (int i = 0; i < m.getRowDimension(); i++) {
    newData[i] = mData[i];
}

答案 2 :(得分:0)

假设重用行数组不是问题(您在当前代码中正在做),将for循环替换为:

double[][] newData = Arrays.copyOf(data, 0, data.length + 1);