PDA

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

Sint
26-04-2006, 01:15
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.

Elyon
30-04-2006, 20:10
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;

...

k0nt3
30-04-2006, 20:19
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 ;)

Elyon
30-04-2006, 20:23
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