Array wird beim Neuaufruf nicht neu initialisiert

Mariaki

Mitglied
Hey,
ich habe ein Problem mit der Weitergabe von Arrays.
Zur Erklärung vereinfache ich die Zahlen (wobei manche, z.B.
Code:
i
,
Code:
src
, Variabel sind)("Er" ist der Debugger/Compiler Eclipse).
Ich möchte aus einer Matrix (
Code:
double[][]
) das erste Array mit dem Ersten Wert der restlichen Arrays multiplizieren. D.h.
ich habe z.B.:
Java:
1, -1.25, -0.5, -2, -4.25 -> Auslassen
0, 10, 0, 12, -6 -> *0 -> 0, 0, 0, 0, 0
0, -5, 0, -4, -23 -> *0 -> 0, 0, 0, 0, 0
4, -10, 0, -16, 2 -> *4 -> 4, -5, -2, -8, -17

Dazu habe ich diesen Code :
Java:
	private int i = 0;
	
	private double[][] src = {{1, -1.25, -0.5, -2, -4.25}, {0, 10, 0, 12, -6}, {0, -5, 0, -4, -23}, {4, -10, 0, -16, 2}};
	
	private double[][] subtractedMtrx(int i, double[][] src) {
		for (int i1 = 0; i1 < src.length; i1++) {
			if (i1 != i) { // i (in dem Fall das erste) ueberspringen, fuer gesammtcode wichtig
				src[i1] = multipliedArry(src[i1][i], src[i]); //Matrix[i] mit dem Matrix[i1][i]-fachen multiplizieren
			}
		}
		return src;
	}
		
	private double[] multipliedArry(double factor, double[] arry) {
		for (int i1 = 0; i1 < arry.length; i1++) {
			arry[i1] = arry[i1] * factor;
		}
		return arry;
	}
Die
Code:
subtractedMtrx
Routine wird im Gesammt-Code aufgerufen.
Code:
i
und
Code:
src
werden dabei übergeben.


Doch übergibt er dabei nur das erste mal in Zeile 8 das
Code:
scr[i]
, sodass in
Code:
multipliedArry
ab dem ersten Schritt (ohne den ausgelassenen) immer das Ergebniss
Code:
{0, 0, 0, 0, 0}
erscheint. Dies fällt beim zweiten Schritt nicht auf, da dort auch *0 ist.
Aber beim vierten Schritt wäre es *4, doch ist
Code:
{0, 0, 0, 0 ,0}
gegeben, und daher ist das Ergebnis auch 0.
D.h. er mach zwei Dinge die ich nicht erwartet habe:
Er übergibt nicht den Array.
Er nimmt den vorherigen Array, der eigentlich bei dem Abschluss der
Code:
multipliedArry
-Routine gelöscht sein sollte.

Ich weiß nicht wirklich wo das Problem dabei ist. Ich hoffe das ist genug Erklärung.

Gruß Mariaki
 
Zuletzt bearbeitet:
@faetzminator: Sry, da ist ein "," zuviel. Ich will damit sagen, dass bei
Code:
{1, -1.25, -0.5, -2, -4.25}
mal jeweils 4
Code:
{4, -5, -2, -8, -17}
herauskommen soll. Doch ist da nicht
Code:
{1, -1.25, -0.5, -2, -4.25}
übergeben wird, sondern
Code:
{0, 0, 0, 0, 0}
, und das mal 4 ist
Code:
{0, 0, 0, 0, 0}
. Das hab ich einfach nur mit "0" abgekürzt.
 
Hmm..

Ein anderes Beispiel:
ich habe:
1. 1, 2, 3
2. 0, 1, 2
3. 3, 2, 1

nun rechne ich das Erste Array mal den jeweils ersten Wert, außer beim Ersten Array. D.h.:

1. 1, 2, 3 wird ausgelassen
2. bei 0, 1, 2 ist der erste Wert 0, also 1*0, 2*0, 3*0 -> 0, 0, 0
3. bei 3, 2, 1 ist der erste Wert 3, also 1*3, 2*3, 3*3 -> 3, 6, 9
also ensteht dabei:
1. 1, 2, 3
2. 0, 0, 0
3. 3, 6, 9

Im Code wird aber nicht 1*3, 2*3, 3*3 -> 3, 6, 9 gerechnet sondern 0*3, 0*3, 0*3 -> 0, 0, 0, da er den Endwert von 2. übernimmt und nicht den Anfangswert von 3. übergibt.
 
Der Fehler liegt da drin das nach dem ersten Aufruf von
Code:
multipliedArry
die erste Zeile deines Arrays
Code:
src
auf
Code:
[0.0, -0.0, -0.0, -0.0, -0.0]
gesetzt wird.
 
Okey.. Ich habe das Problem selbst gelößt.

Ich habe einfach nicht das Ergebnis direkt in den Array geschrieben, sondern in einen neuen.

D.h. anstatt:
[JAVA=16]arry[i1] = arry[i1] * factor;[/code]
das:
[JAVA=17]result[i1] = arry[i1] * factor;[/code]

Also insgesamt:
Java:
    private int i = 0;
    
    private double[][] src = {{1, -1.25, -0.5, -2, -4.25}, {0, 10, 0, 12, -6}, {0, -5, 0, -4, -23}, {4, -10, 0, -16, 2}};
    
    private double[][] subtractedMtrx(int i, double[][] src) {
        for (int i1 = 0; i1 < src.length; i1++) {
            if (i1 != i) { // i (in dem Fall das erste) ueberspringen, fuer gesammtcode wichtig
                src[i1] = multipliedArry(src[i1][i], src[i]); //Matrix[i] mit dem Matrix[i1][i]-fachen multiplizieren
            }
        }
        return src;
    }
        
    private double[] multipliedArry(double factor, double[] arry) {
        double[] result = new double[arry.length];
        for (int i1 = 0; i1 < arry.length; i1++) {
            result[i1] = arry[i1] * factor;
        }
        return arry;
    }

@Camill: Und warum? Werden die Array dadurch verknüpft. D.h. src immer gleich arry. Ich komme von Delphi, da gab es sowas nicht, aber bei java hatte ich schon mal so ein Problem. Ich dachte, dass kommt nur wenn man src = arry setzten würde, oder passiert das wenn ich das so wie hier übergebe?
 
Wozu brauchst du das eigentlich?

Mal abgesehen davon, ....
Ich möchte aus einer Matrix (double[][] ) das erste Array mit dem Ersten Wert der restlichen Arrays multiplizieren.


Java:
1, -1.25, -0.5, -2, -4.25 -> Auslassen
0, 10, 0, 12, -6 -> *0 -> 0, 0, 0, 0, 0
0, -5, 0, -4, -23 -> *0 -> 0, 0, 0, 0, 0
4, -10, 0, -16, 2 -> *4 -> 4, -5, -2, -8, -17

Ein anderes Beispiel:
1. 1, 2, 3 wird ausgelassen
2. bei 0, 1, 2 ist der erste Wert 0, also 1*0, 2*0, 3*0 -> 0, 0, 0
3. bei 3, 2, 1 ist der erste Wert 3, also 1*3, 2*3, 3*3 -> 3, 6, 9

Das ist doch nicht das selbe, oder?

Gute Nacht.
Deine letzte Frage kann ich leider nicht beantworten.
 
@Camill: Und warum? Werden die Array dadurch verknüpft. D.h. src immer gleich arry. Ich komme von Delphi, da gab es sowas nicht, aber bei java hatte ich schon mal so ein Problem. Ich dachte, dass kommt nur wenn man src = arry setzten würde, oder passiert das wenn ich das so wie hier übergebe?

So, nun auch die Erklärung:

Durch
Code:
src[i]
im folgenden Aufruf wird nur die Referenz auf das Array
Code:
src
übergeben:
[JAVA=8] src[i1] = multipliedArry(src[i1], src); //Matrix mit dem Matrix[i1]-fachen multiplizieren[/code]
Sowohl
Code:
src
als auch
Code:
arry
beziehen sich somit auf das selbe Array.
 
Zuletzt bearbeitet:
@Camill: Danke. Deswegen wird das auch durch meine Lösung umgangen. In Delphi wurde immer einfach ein neues Array gemacht.

@Kababär: Ich wollte das für den Gaußschen Algorithmus nutzen. Da muss man das dann noch jeweils subtrahieren. Und, doch, das ist im Prinzip das Gleiche, nur beim zweiten ausführlicher in der Erklärung, aber einfacher von den Zahlen und der Menge der Zahlen

Ich schließe dann mal den Thread. Danke an alle.
 

Zurück
Oben