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!
3 respuestas
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
.
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);
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);
}
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].