【问题标题】:What is the best way to append a row to matrix?将行附加到矩阵的最佳方法是什么?
【发布时间】:2019-05-10 15:40:59
【问题描述】:

我正在尝试将一行附加到预先存在的矩阵。我写了一些代码(如下所示)来解决这个问题,但我不禁觉得有更好的方法来做到这一点(或者也许已经有一个 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}}

感谢任何提示!

【问题讨论】:

    标签: java matrix linear-algebra apache-commons


    【解决方案1】:

    假设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)并同时打印 m 和 m2。

    【讨论】:

      【解决方案2】:

      你走对了。我唯一可以添加的想法是替换此循环:

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

      与:

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

      【讨论】:

        【解决方案3】:

        假设重用行数组(您在当前代码中正在执行的操作)没有问题,那么将 for 循环替换为:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-08
          • 2013-05-21
          • 2020-10-21
          • 2015-10-20
          • 1970-01-01
          • 2013-05-09
          • 2011-11-21
          相关资源
          最近更新 更多