我正在尝试将行追加到预先存在的矩阵中。我写了一些能达到目的的代码(如下所示),但我不禁感到有一种更好的方法可以做到这一点(或者也许已经有一个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}}
任何提示都值得赞赏!
答案 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)并同时打印m
和m2
。 / 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);