Estoy tratando de obtener una submatriz de una matriz, pero tengo dificultades con la lógica detrás de ella. Para una matriz como esta:
1 2 3 4 5 6 7 8 9Necesito poder obtener submatriz (A, 3, 2):
1 3 4 6Esto es lo que he probado hasta ahora
public Matrix submatrix(Matrix A, int i, int j) { Matrix subM = new Matrix(this.rows + 1, this.columns + 1); for (int r = i; r < this.rows; r++) { for (int c = j; c < this.columns; c++) { subM.data[r - i][c - j] = A.data[r][c]; } } return subM; }Y así es como estoy tratando de llamarlo en main
Matrix A = new Matrix(new double[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}}); int i = 3; int j = 2; Matrix m = A.submatrix(A, i, j); System.out.println("L:\n" + m);Soy nuevo en Java, así que agradecería cualquier ayuda.
Debe pasar a su método el alcance de la submatriz que desea copiar, es decir, sus posiciones starting y ending , tanto en las rows como en las columns , algo como:
public Matrix submatrix(Matrix A, int row_begin, int row_end, int col_begin, int col_end) { Matrix subM = new Matrix(row_end - row_begin, col_end - col_begin); for (int r = row_begin, i=0; r < row_end; r++, i++) for (int c = col_begin, j= 0; c < col_end; c++, j++) subM.data[i][j] = A.data[r][c]; return subM; } Por lo general, en problemas en los que necesita iterar simultáneamente sobre dos estructuras de datos diferentes y no comienza a iterar desde las mismas posiciones, es más fácil usar una variable de índice diferente para cada una de esas estructuras. En el siguiente código, uso las variables i y j para iterar sobre la matriz subM.data y las variables r y c para iterar sobre la matriz A.data
Entonces llamarías submatrix(A, 0, 2, 0, 3) . La salida sería:
1 2 3 4 5 6que creo que es lo que realmente quieres, pero corrígeme si me equivoco.
Por cierto , estoy asumiendo una entrada de buen comportamiento. Normalmente, necesitará agregar verificaciones adicionales en las variables row_begin , row_end , col_begin , col_end para asegurarse de que no tendrá problemas ( p. ej., IndexOutofbounds ).
Ahora, si realmente desea poder omitir filas y columnas en el medio, entonces las cosas se complican más. Una solución es pasar como parámetro también el rango de columnas/filas a omitir, algo así como:
int[][] submatrix(int [][] data, int row_begin, int row_end, int skip_row_begin, int skip_row_end, int col_begin, int col_end, int skip_col_begin, int skip_col_end) { int number_rows = row_end - row_begin - (skip_row_end - skip_row_begin); int number_cols = col_end - col_begin - (skip_col_end - skip_col_begin); int [][] subM = new int[number_rows] [number_cols]; for (int r = row_begin, i=0; r < row_end; r++) { if(r < skip_row_begin || r >= skip_row_end) { for (int c = col_begin, j = 0; c < col_end; c++) { if(c < skip_col_begin || c >= skip_col_end) { subM[i][j] = data[r][c]; j++; } } i++; } } return subM; } Si no desea omitir las filas o las columnas, proporcione como rango el tamaño de la matriz. En su ejemplo, desea omitir las columnas del medio, ya que llamaría al método de submatrix de la siguiente manera:
int [][] submatrix(data, 0 , 2, data.length, data.length, 0 , 3, 1, 2); for (int[] ints : a) { for (int anInt : ints) System.out.print(anInt + " "); System.out.println("\n"); }Esto daría como resultado:
1 3 4 6