 
View Full Version : [JAVA]HELP Clone()
maforast
25-04-2006, 14:53
Salve ragazzi ho un problema devo fare il clone di un oggetto prima di andare a modificare i pesi di una matrice che è definita al suo interno come campo privato. 
Presupposto che ho implementato il metodo clone nell'oggetto WeightMatrix con anche il campo privato weight ma il risultato è che dopo l'esecuzione del clone sia l'oggetto originale ke quello clonato mi restituiscono lo stesso valore della matrice weight. Mentre uno dovrebbe restituirmi il vekkio vaolore e il clone il nuovo... In cosa sbaglio?
void changeFibredWeight(float input)
     {
  		for(int k = lastMatrix; k >= 0; k--)
        {
        	WeightMatrix weight=weightMatrixArray[k];
        	WeightMatrix w=(WeightMatrix)weight.clone();
            w.changeFibredWeights(input);   	
            float[][] ss=w.getWeights();
            float[][] sss=weight.getWeights();
            System.out.println("i pesi nuovi sono "+ss[0][0]);
            System.out.println("i pesi vekki sono "+sss[0][0]);
     			
	}
   }
Grazie
Ad una prima e rapida occhiata mi verrebbe da pensare che clone() non sia implementato nel modo giusto, anche perchè nel resto del codice non vedo problemi.
Credo anch'io che tu abbia sbagliato a reimplementare il metodo clone() di Java. Sei sicuro di aver fatto nel metodo una copia "profonda" degli oggetti weight, e non una copia dei soli riferimenti?
maforast
30-04-2006, 20:14
Credo anch'io che tu abbia sbagliato a reimplementare il metodo clone() di Java. Sei sicuro di aver fatto nel metodo una copia "profonda" degli oggetti weight, e non una copia dei soli riferimenti?
Ho fatto così
	public Object clone()
	{
		try
		{
			WeightMatrix cloned=(WeightMatrix)super.clone();
			cloned.weight=(float[][])this.weight.clone();
			cloned.bias=(float[])this.bias.clone();
			return cloned;
		}
		catch (CloneNotSupportedException e) { return null;	}
	}
considerando ke i campi privati della classe sono :
 float weight[][];
    float bias[];
    int size;
...
Ho fatto così
	public Object clone()
	{
		try
		{
			WeightMatrix cloned=(WeightMatrix)super.clone();
			cloned.weight=(float[][])this.weight.clone();
			cloned.bias=(float[])this.bias.clone();
			return cloned;
		}
		catch (CloneNotSupportedException e) { return null;	}
	}
considerando ke i campi privati della classe sono :
 float weight[][];
    float bias[];
    int size;
...
se nella matrice ci sono degli oggetti in questo modo copi i riferimenti agli oggetti. dovresti fare un ciclo dove cloni ciascun elemento della matrice ;)
In questo modo, essendo la matrice un'array di array, e quindi di oggetti, non fai altro che copiare i riferimenti a quei vettori. Dovresti creare una nuova matrice e inserire al suo interno i valori presenti nella vecchia. Solo così fai una copia profonda.
Spero di essere stata utile.
maforast
30-04-2006, 20:41
In questo modo, essendo la matrice un'array di array, e quindi di oggetti, non fai altro che copiare i riferimenti a quei vettori. Dovresti creare una nuova matrice e inserire al suo interno i valori presenti nella vecchia. Solo così fai una copia profonda.
Spero di essere stata utile.
grazie sì sei stata utile in realtà ho risolto creando una matrice weight che mantiene i valori (float) vekki e quelli modificati vanno nella weight originale quindi non ho avuto + bisogno del clone ankè perkè pensavo di aver fatto tutto bene... 
grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.