Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将行附加到矩阵的最佳方式是什么?_Java_Matrix_Linear Algebra_Apache Commons - Fatal编程技术网

Java 将行附加到矩阵的最佳方式是什么?

Java 将行附加到矩阵的最佳方式是什么?,java,matrix,linear-algebra,apache-commons,Java,Matrix,Linear Algebra,Apache Commons,我试图将一行附加到预先存在的矩阵中。我写了一些代码(如下所示)来实现这一点,但我忍不住觉得有更好的方法来实现这一点(或者可能已经有一个apachecommons函数来实现这一点??) 代码 private RealMatrix appendRow(RealMatrix m) { double[][] mData = m.getData(); double[][] newData = new double[m.getRowDimension()+1][m.getColumnDim

我试图将一行附加到预先存在的矩阵中。我写了一些代码(如下所示)来实现这一点,但我忍不住觉得有更好的方法来实现这一点(或者可能已经有一个apachecommons函数来实现这一点??)

代码

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);
}

任何提示都将不胜感激

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

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

for(int i=0;i
你走对了路。我唯一可以添加的想法是替换此循环:

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

for(int i=0;i
假设
RealMatrix
是您的自定义类,您需要编写一些代码。有像ApacheCommonsLang这样的库,它有一个方法
ArrayUtils.add(数组,新元素)
(实际上是一堆重载),但您的代码并没有那么复杂,无法证明仅为此添加一个额外的依赖项是合理的

但有几点需要注意:

double[]newData=newdouble[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

,假设
RealMatrix
是您的自定义类,您无论如何都需要编写一些代码。有像ApacheCommonsLang这样的库,它有一个方法
ArrayUtils.add(数组,新元素)
(实际上是一堆重载),但您的代码并没有那么复杂,无法证明仅为此添加一个额外的依赖项是合理的

但有几点需要注意:

double[]newData=newdouble[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

,假设重用行数组(您在当前代码中执行的操作)不成问题,则将for循环替换为:

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

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

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