Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Raggruppare celle di una matrice ad n^2 alla volta

    Mi spiego ho una matrice di una qualsivoglia dimensione, mettiamo che sia 5 righe e 5 colonne.
    Vorrei scorrere la matrice in maniera tale da leggere n celle per volta che siano allineate a formare un quadrato, ovvero se n è uguale a 2 voglio leggere:

    cella riga i colonna j
    cella riga i colonna j+1
    cella riga i+1 colonna j
    cella riga i+1 colonna j+1

    Come posso fare?

    Per altro se la matrice è 5x5 ed n è 2 allora allora voglio leggere [0][0] [0][1] [1][0] [1][1], poi [0][2] [0][3] [1][2] [1][3] e poi alla fine della riga voglio leggere solo [4][0] [4][1].

    Idem per l'ultima riga dove avrò invece da leggere i nodi a due a due. Non so se mi spiego. Ci sto davvero perdendo la testa quindi qualsiasi suggerimento è ben accetto
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2

    Re: Raggruppare celle di una matrice ad n^2 alla volta

    Originariamente inviato da Neptune
    ...e poi alla fine della riga voglio leggere solo [4][0] [4][1].
    Forse intendevi [0][4] [1][4]?

    In ogni caso vuoi leggere una sola riga oppure alla fine della riga riprendi da [2][0] [2][1] [3][0] [3][1] ecc.. ?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Mia interpretazione
    codice:
    a b c d e f g h i l m
    
    n o p q r s t u v w z
    
    a b c d e f g h i l m
    
    n o p q r s t u v w z
    dovrebbe diventare:

    codice:
    ab  cd  ef  gh  il  m
    no  pq  rs  tu  vw  z
    
    ab  cd  ef  gh  il  m
    no  pq  rs  tu  vw  z
    Linea vuota delimita le righe, spazio delimita le colonne. Nel secondo codice,

    codice:
    ab
    no
    sarebbe un singolo elemento, ottenuto dal raggruppamento di 4 celle della matrice di partenza.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  4. #4
    Ovviamente solo una bozza migliorabile:

    codice:
    public class Matrix {
    
    	private String[][] matrix = null;
    
    	public Matrix() {
    	}
    
    	public Matrix(String[][] matrix) {
    		this.matrix = matrix;
    	}
    
    	public Matrix getSubMatrix(int row, int column, int width, int height) {
    		try {
    			int r0 = matrix.length - row > height ? height : matrix.length - row;
    			int c0 = matrix.length - column > width ? width : matrix.length - column;
    			String[][] m = new String[r0][c0];
    			for (int r = 0; r < m.length; r++) {
    				for (int c = 0; c < m[0].length; c++) {
    					m[r][c] = matrix[row + r][column + c];
    				}
    			}
    			return new Matrix(m);
    		} catch (Exception e) {
    			return new Matrix();
    		}
    	}
    
    	public String getValue(int row, int column) {
    		try {
    			return matrix[row][column];
    		} catch (Exception e) {
    			return "";
    		}
    	}
    
    	public void setValue(int row, int column, String value) {
    		try {
    			matrix[row][column] = value;
    		} catch (Exception e) {
    		}
    	}
    
    	public int getRows() {
    		try {
    			return matrix.length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	public int getColumns() {
    		try {
    			return matrix[0].length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	@Override
    	public String toString() {
    		StringBuffer sb = new StringBuffer("");
    		try {
    			for (int r = 0; r < matrix.length; r++) {
    				sb.append("[");
    				for (int c = 0; c < matrix[0].length; c++) {
    					sb.append("[" + matrix[r][c] + "]");
    				}
    				sb.append("]");
    			}
    		} catch (Exception e) {
    			sb.append("[]");
    		}
    		return sb.toString();
    	}
    
    	public static void main(String[] args) {
    		String[][] matrix = {
    				{"00", "01", "02", "03", "04"}, 
    				{"10", "11", "12", "13", "14"}, 
    				{"20", "21", "22", "23", "24"}, 
    				{"30", "31", "32", "33", "34"}, 
    				{"40", "41", "42", "43", "44"} 
    		};
    
    		Matrix m = new Matrix(matrix);
    
    		int n = 2;
    
    		int rLimit = (int) Math.ceil((double) m.getRows() / (double) n);
    		int cLimit = (int) Math.ceil((double) m.getColumns() / (double) n);
    
    		for (int r = 0, rr = 0; r < rLimit; r++, rr += n) {
    			for (int c = 0, cc = 0; c < cLimit; c++, cc += n) {
    				Matrix sm = m.getSubMatrix(rr, cc, n, n);
    				System.out.println(sm);
    			}
    		}
    	}
    
    }
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Originariamente inviato da Pastore12
    Mia interpretazione
    codice:
    a b c d e f g h i l m
    
    n o p q r s t u v w z
    
    a b c d e f g h i l m
    
    n o p q r s t u v w z
    dovrebbe diventare:

    codice:
    ab  cd  ef  gh  il  m
    no  pq  rs  tu  vw  z
    
    ab  cd  ef  gh  il  m
    no  pq  rs  tu  vw  z
    Linea vuota delimita le righe, spazio delimita le colonne. Nel secondo codice,

    codice:
    ab
    no
    sarebbe un singolo elemento, ottenuto dal raggruppamento di 4 celle della matrice di partenza.
    Si nel tuo codice ci sarebbe anche da dire che se ci fosse anche un ulteriore riga alla fine vorrei poter prendere gli elementi dell'ultima riga almeno a due a due.
    Insomma è come se sto facendo un pavimento, cerchi di ricoprirlo il più possibile con le mattonelle ma quando arrivi agli angoli dove una mattonella intera non ci entra la devi tagliare a metà.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Originariamente inviato da satifal
    Ovviamente solo una bozza migliorabile:

    codice:
    public class Matrix {
    
    	private String[][] matrix = null;
    
    	public Matrix() {
    	}
    
    	public Matrix(String[][] matrix) {
    		this.matrix = matrix;
    	}
    
    	public Matrix getSubMatrix(int row, int column, int width, int height) {
    		try {
    			int r0 = matrix.length - row > height ? height : matrix.length - row;
    			int c0 = matrix.length - column > width ? width : matrix.length - column;
    			String[][] m = new String[r0][c0];
    			for (int r = 0; r < m.length; r++) {
    				for (int c = 0; c < m[0].length; c++) {
    					m[r][c] = matrix[row + r][column + c];
    				}
    			}
    			return new Matrix(m);
    		} catch (Exception e) {
    			return new Matrix();
    		}
    	}
    
    	public String getValue(int row, int column) {
    		try {
    			return matrix[row][column];
    		} catch (Exception e) {
    			return "";
    		}
    	}
    
    	public void setValue(int row, int column, String value) {
    		try {
    			matrix[row][column] = value;
    		} catch (Exception e) {
    		}
    	}
    
    	public int getRows() {
    		try {
    			return matrix.length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	public int getColumns() {
    		try {
    			return matrix[0].length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	@Override
    	public String toString() {
    		StringBuffer sb = new StringBuffer("");
    		try {
    			for (int r = 0; r < matrix.length; r++) {
    				sb.append("[");
    				for (int c = 0; c < matrix[0].length; c++) {
    					sb.append("[" + matrix[r][c] + "]");
    				}
    				sb.append("]");
    			}
    		} catch (Exception e) {
    			sb.append("[]");
    		}
    		return sb.toString();
    	}
    
    	public static void main(String[] args) {
    		String[][] matrix = {
    				{"00", "01", "02", "03", "04"}, 
    				{"10", "11", "12", "13", "14"}, 
    				{"20", "21", "22", "23", "24"}, 
    				{"30", "31", "32", "33", "34"}, 
    				{"40", "41", "42", "43", "44"} 
    		};
    
    		Matrix m = new Matrix(matrix);
    
    		int n = 2;
    
    		int rLimit = (int) Math.ceil((double) m.getRows() / (double) n);
    		int cLimit = (int) Math.ceil((double) m.getColumns() / (double) n);
    
    		for (int r = 0, rr = 0; r < rLimit; r++, rr += n) {
    			for (int c = 0, cc = 0; c < cLimit; c++, cc += n) {
    				Matrix sm = m.getSubMatrix(rr, cc, n, n);
    				System.out.println(sm);
    			}
    		}
    	}
    
    }
    Ora lo guardo con più calma
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  7. #7
    Umm in quel codice mi sto un po' perdendo, io di preciso la mia matrice dovendo potersi espandere dinamicamente l'ho rappresentata come un array list di array list, ovvero io ho:

    codice:
    ArrayList<ArrayList<Cella_base>> mappa
    Quello che poi mi interessa restituire a me non è nemmeno il contenuto delle celle, perché sto cercando di partizione la matrice, quindi dovrei prendermi proprio gli indici di riga e colonna e non il contenuto.

    Come potrei modificarlo? non è che mi metti qualche commentino così non mi perdo ?

    Grazie comunque per l'aiuto.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  8. #8
    Originariamente inviato da Neptune
    Umm in quel codice mi sto un po' perdendo, io di preciso la mia matrice dovendo potersi espandere dinamicamente l'ho rappresentata come un array list di array list, ovvero io ho:

    codice:
    ArrayList<ArrayList<Cella_base>> mappa
    Quello che poi mi interessa restituire a me non è nemmeno il contenuto delle celle, perché sto cercando di partizione la matrice, quindi dovrei prendermi proprio gli indici di riga e colonna e non il contenuto.

    Come potrei modificarlo? non è che mi metti qualche commentino così non mi perdo ?

    Grazie comunque per l'aiuto.
    Scusa, fammi capire, posti una domanda ben precisa e dopo che qualcuno si sbatte per trovarti una soluzione dici "scusate tanto ho scherzato...in realtà mi serviva quest'altra cosa"?!?!?!?!?!?!
    Perdonami se ti ho fatto perdere tempo con la lettura del mio codice!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  9. #9
    Originariamente inviato da satifal
    Scusa, fammi capire, posti una domanda ben precisa e dopo che qualcuno si sbatte per trovarti una soluzione dici "scusate tanto ho scherzato...in realtà mi serviva quest'altra cosa"?!?!?!?!?!?!
    Scusami, ti ringrazio per l'aiuto e non me ne volere, credevo che mi si abbozzasse uno pseudocodice e poi l'avrei adattato per la mia rappresentazione della matrice. Scusami ancora.

    Io ho provato a modificarla così:
    codice:
    package lettura_mappa;
    
    import java.util.ArrayList;
    
    import javax.print.attribute.Size2DSyntax;
    
    public class Matrix {
    
    	private ArrayList<ArrayList<Cella_base>> matrix = null;
    
    	public Matrix() {
    	}
    
    	public Matrix(ArrayList<ArrayList<Cella_base>> matrix) {
    		this.matrix = matrix;
    	}
    
    	public Matrix getSubMatrix(int row, int column, int width, int height) {
    		try {
    			int r0 = matrix.length - row > height ? height : matrix.length - row;
    			int c0 = matrix.length - column > width ? width : matrix.length - column;
    			String[][] m = new String[r0][c0];
    			for (int r = 0; r < m.length; r++) {
    				for (int c = 0; c < m[0].length; c++) {
    					m[r][c] = matrix[row + r][column + c];
    				}
    			}
    			return new Matrix(m);
    		} catch (Exception e) {
    			return new Matrix();
    		}
    	}
    
    	public Cella_base getValue(int row, int column) {
    			//return matrix[row][column];
    			return (matrix.get(column)).get(row);
    
    	}
    
    	public int getRows() {
    		try {
    			return (matrix.get(0)).size();
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	public int getColumns() {
    		try {
    			return matrix.size();
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	@Override
    	public String toString() {
    		StringBuffer sb = new StringBuffer("");
    		try {
    			for (int r = 0; r < matrix.length; r++) {
    				sb.append("[");
    				for (int c = 0; c < matrix[0].length; c++) {
    					sb.append("[" + matrix[r][c] + "]");
    				}
    				sb.append("]");
    			}
    		} catch (Exception e) {
    			sb.append("[]");
    		}
    		return sb.toString();
    	}
    
    	public static void main(String[] args) {
    		String[][] matrix = {
    				{"00", "01", "02", "03", "04"}, 
    				{"10", "11", "12", "13", "14"}, 
    				{"20", "21", "22", "23", "24"}, 
    				{"30", "31", "32", "33", "34"}, 
    				{"40", "41", "42", "43", "44"} 
    		};
    
    		Matrix m = new Matrix(matrix);
    
    		int n = 2;
    
    		int rLimit = (int) Math.ceil((double) m.getRows() / (double) n);
    		int cLimit = (int) Math.ceil((double) m.getColumns() / (double) n);
    
    		for (int r = 0, rr = 0; r < rLimit; r++, rr += n) {
    			for (int c = 0, cc = 0; c < cLimit; c++, cc += n) {
    				Matrix sm = m.getSubMatrix(rr, cc, n, n);
    				System.out.println(sm);
    			}
    		}
    	}
    }
    Non riesco bene a capire getsubmatrix ed il tostring come lavorano. Mentre il setvalue non mi serviva proprio.

    Ti ringrazio ancora per l'aiuto.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  10. #10
    Ho provato a modificarlo nel seguente modo:
    codice:
    package lettura_mappa;
    import java.util.ArrayList;
    class Coppia
    {
    	int riga;
    	int colonna;
    	public Coppia(int r, int c)
    	{
    		riga = r;
    		colonna = c;
    	}
    	public int get_riga()
    	{
    		return riga;
    	}
    	public int get_colonna()
    	{
    		return colonna;
    	}
    	public String toString(){
    	    return "(" + riga + "," + colonna + ")";
    
    	}
    }
    public class Matrix {
    
    	private Coppia[][] matrix = null;
    
    	public Matrix() {
    	}
    
    	public Matrix(ArrayList<ArrayList<Cella_base>> mappa) {
    		int righe = mappa.size();
    		int colonne = mappa.get(0).size();
    		matrix = new Coppia[righe][colonne];
    		for (int i = 0; i < righe; i++) {
    			for (int j = 0; j < colonne; j++) {
    				matrix[i][j] = new Coppia(i, j);
    			}
    		}
    		
    	}
    	
    	public Matrix(Coppia[][] matrix) {
    		this.matrix = matrix;
    	}
    
    	public Matrix getSubMatrix(int row, int column, int width, int height) {
    		try {
    			int r0 = matrix.length - row > height ? height : matrix.length - row;
    			int c0 = matrix.length - column > width ? width : matrix.length - column;
    			Coppia[][] m = new Coppia[r0][c0];
    			for (int r = 0; r < m.length; r++) {
    				for (int c = 0; c < m[0].length; c++) {
    					m[r][c] = matrix[row + r][column + c];
    				}
    			}
    			return new Matrix(m);
    		} catch (Exception e) {
    			return new Matrix();
    		}
    	}
    
    	public Coppia getValue(int row, int column) {
    		try {
    			return matrix[row][column];
    		} catch (Exception e) {
    			return new Coppia(-1, -1);
    		}
    	}
    
    	/*public void setValue(int row, int column, int value) {
    		try {
    			matrix[row][column] = value;
    		} catch (Exception e) {
    		}
    	}*/
    
    	public int getRows() {
    		try {
    			return matrix.length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	public int getColumns() {
    		try {
    			return matrix[0].length;
    		} catch (Exception e) {
    			return 0;
    		}
    	}
    
    	@Override
    	public String toString() {
    		StringBuffer sb = new StringBuffer("");
    		try {
    			for (int r = 0; r < matrix.length; r++) {
    				sb.append("[");
    				for (int c = 0; c < matrix[0].length; c++) {
    					sb.append("[" + matrix[r][c] + "]");
    				}
    				sb.append("]");
    			}
    		} catch (Exception e) {
    			sb.append("[]");
    		}
    		return sb.toString();
    	}
    	
    
    	public static void main(String[] args) {
    
    		Mappa_reale map = new Mappa_reale();
    		System.out.println(map.mappa);
    		Matrix m = new Matrix(map.mappa);
    
    		int n = 2;
    
    		int rLimit = (int) Math.ceil((double) m.getRows() / (double) n);
    		int cLimit = (int) Math.ceil((double) m.getColumns() / (double) n);
    
    		for (int r = 0, rr = 0; r < rLimit; r++, rr += n) {
    			for (int c = 0, cc = 0; c < cLimit; c++, cc += n) {
    				Matrix sm = m.getSubMatrix(rr, cc, n, n);
    				System.out.println(sm);
    			}
    		}
    	}
    
    }

    Come output ho questo:
    codice:
    [[(0,0)][(0,1)]][[(1,0)][(1,1)]]
    []
    [[(2,0)][(2,1)]][[(3,0)][(3,1)]]
    []
    [[(4,0)][(4,1)]]
    []
    considerando che la matrice è questa:
    codice:
    00 01 02
    10 11 12
    20 21 22
    30 31 32
    40 41 42
    In pratica non ci stampa l'ultima colonna e ci restituisce quindi quelli spazi vuoti [].

    Forse abbiamo modificato male il getsubmatrix?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.