Estoy tratando de agregar una fila a una matriz preexistente. Escribí un código (que se muestra a continuación) que hace el truco, pero no puedo evitar sentir que hay una mejor manera de hacerlo (o tal vez ya existe una función de Apache Commons que hace esto ???).

Código

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

Ejemplo de uso y salida

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

Cualquier consejo es apreciado!

0
SoftwareStudent123 10 may. 2019 a las 18:40

3 respuestas

La mejor respuesta

Suponiendo que RealMatrix es su clase personalizada, de todos modos necesitaría escribir parte del código. Hay bibliotecas como Apache Commons Lang que tiene un método ArrayUtils.add(array, new element) (en realidad un montón de sobrecargas) pero su código no es tan complejo para justificar la adición de una dependencia adicional solo por eso.

Algunas notas sin embargo:

double[][] newData = new double[m.getRowDimension()+1][m.getColumnDimension()]; ya crea las matrices "internas", es decir, las filas, por lo que newData[m.getRowDimension()] = new double[m.getColumnDimension()]; es innecesario.

También tenga en cuenta que newData[i] = mData[i]; arriesga múltiples matrices usando las mismas filas y, por lo tanto, cambiar una también cambiaría otras. Por lo tanto, le sugiero que haga una copia usando System.arrayCopy(mData[i], 0, newData[i], 0, mData[i].length ) en lugar de newData[i] = mData[i].

Para ilustrar el último punto, intente RealMatrix m2 = appendRow(m);, luego cambie uno de los elementos copiados (por ejemplo, cambie [0] [0] a 7) e imprima tanto m como m2.

2
Thomas 10 may. 2019 a las 15:53

Asumiendo que no es un problema reutilizar las matrices de filas (lo que está haciendo en su código actual), sería más fácil reemplazar el bucle for con:

double[][] newData = Arrays.copyOf(data, 0, data.length + 1);
0
Andy Turner 10 may. 2019 a las 16:15

Sigues el camino correcto. Lo único que puedo agregar es reemplazar este bucle:

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

Con:

for (int i = 0; i < m.getRowDimension(); i++) {
    System.arraycopy(mData[i], 0, newData[i], 0, mData[i].length);
}
0
Golov Pavel 10 may. 2019 a las 16:00