Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    Metodo estrazione minori da Matrice

    Ho implementato una classe Matrice le cui istanze rappresentano delle matrici n x m (di n righe e m colonne).
    Ora , oltre gli altri metodi che ho già implementato , vorrei crearne uno per la determinazione del rango (procedendo col trovare l'ordine massimo di un minore estraibile dalla matrice che abbia determinante diverso da zero) passando quindi prima dall'implementazione di un metodo per la determinazione dei minori estraibili (è proprio questo il metodo per il quale chiedo aiuto).
    Vi posto un po' di codice riguardo la struttura della classe e dei metodi che penso siano utili per la realizzazione del metodo richiesto:

    codice:
    class Matrice {
    
    	private double [][] mat;
    
            //UNO DEI VARI COSTRUTTORI , GIUSTO PER RENDERE L'IDEA
    	public Matrice (double [][] matrice) {
    		mat = matrice;
    	}
            
            ........
    
            public double [][] getArray () {
    		return mat;
    	}
    
            public Matrice removeRiga (int riga) throws OperazioneMatriceIllegale {
    		double [][] restituire;
    		if (riga >= mat.length) {
    			throw new OperazioneMatriceIllegale ("Il numero della riga specificata va oltre la dimensione della matrice");
    		}else {
    			restituire = new double [mat.length - 1][mat [0].length];
    			int r = 0;
    			for (int i=0;i<mat.length;i++) {
    				for (int j=0;j<mat [0].length;j++) {
    					if (i != riga) {
    						System.out.println ("R="+r+"\tI="+i+"\tJ="+j);
    						restituire [r][j] = mat [i][j];
    					}
    				}
    				if (i != riga)
    					r++;
    			}
    		}
    
    		return new Matrice (restituire);
    
    	}
    
    	public Matrice removeColonna (int colonna ) throws OperazioneMatriceIllegale {
    		double [][] restituire = new double [mat.length][mat [0].length - 1];
    		if (colonna >= mat [0].length) {
    			throw new OperazioneMatriceIllegale ("Il numero della colonna specificata va oltre la dimensione della matrice");
    		}else {
    			int c = 0;
    			for (int i=0;i<mat.length;i++) {
    				for (int j=0;j<mat [0].length;j++) {
    					if (j != colonna) {
    						restituire [i][c] = mat [i][j];
    						c++;
    						c=c%restituire [0].length;
    					}
    				}
    			}
    		}
    
    		return new Matrice (restituire);
    
    	}
    
            public Matrice [] getMinori (int ordine) {
    		//E' QUESTO IL METODO PER IL QUALE CHIEDO AIUTO A VOI
            }
    
            
    }
    L'idea sarebbe quella di trovare tutti i minori di ordine n della matrice mediante l'adeguato utilizzo dei metodi removeRiga e removeColonna ma purtroppo non ne vengo a capo..fin quando si tratta di rimuovere una riga/colonna è facile ricavare tutti i possibili minori ma man mano che scende l'ordine dei minori (quindi vanno rimosse più righe/colonne) vado in confusione..
    Dunque chiedo a voi , mi aiutate nell'implementazione di tale metodo?Da solo non so se ne verrei a capo

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Credo di esserci riuscito!!

    Ho fatto così , se notate qualcosa di inesatto e/o inefficiente ditelo pure :

    codice:
    public Matrice [] getMinori (int ordine) throws OperazioneMatriceIllegale {
    	ArrayList<Matrice> temp = new ArrayList<Matrice> ();
    	temp.add (this);
    	return metodoColonne (mat [0].length - ordine , metodoRighe (mat.length - ordine , temp)).toArray (new Matrice [] {});
    }
    
    private ArrayList<Matrice> metodoRighe (int ordine , ArrayList<Matrice> l) throws OperazioneMatriceIllegale {
    	if (ordine < 1) {
    		return l;
    	}else {
    		ArrayList<Matrice> lista = new ArrayList<Matrice> ();
    		Matrice temp;
    		for (int i=0;i<l.size ();i++) {
    			temp = l.get (i);
    			for (int j=0;j<temp.getRighe ();j++) {
    				lista.add (temp.removeRiga (j));
    			}
    		}
    
    		if (ordine == 1) {
                    	return lista;
                    }
                    return metodoRighe (ordine - 1 , lista);
    	}
    }
    
    private ArrayList<Matrice> metodoColonne (int ordine , ArrayList<Matrice> l) throws OperazioneMatriceIllegale {
    	if (ordine < 1) {
    		return l;
    	}else {
    		ArrayList<Matrice> lista = new ArrayList<Matrice> ();
    		Matrice temp;
    		for (int i=0;i<l.size ();i++) {
    			temp = l.get (i);
    			for (int j=0;j<temp.getColonne (0);j++) {
    				lista.add (temp.removeColonna (j));
    			}
    		}
    
    		if (ordine == 1) {
                            return lista;
                    }
                    return metodoColonne (ordine - 1 , lista);
    	}
    }


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.