# Transponierte Matrix



## Guest (11. Dez 2005)

Hallo,

ich muss eine Methode schreiben, die 
eine gegebene quadratische Matrix
ind deren transponierte umwandelt.
Wie mache ich sowas??


----------



## Gast (11. Dez 2005)

habe vergessen mein jetziges Programm hinzuschreiben:
public void transpose ( int[][] matrix ) //throws MatrixExceptions
  {	
	int m = 1, n = 1; // number of rows / columns
	matrix = new int[m][n]; 
	for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
        	 matrix[j]_ = matrix[j];

  }

könnte das so ungefähr stimmen???_


----------



## HAOSK (11. Dez 2005)

Hi,
also ich glaube nicht dass das so funktionieren wird...

1. ich würde eine neue matrix anlegen
     int[][] matrixTrans = new  int[matrix[].length()][matrix[][].length()];

2. die entsprechende werte in der neuen Matrix speichern.

3. Die neue Matrix zurückgeben...(return matrixTrans)

Gruß


----------



## Maximum (11. Dez 2005)

Jo so müsste es klappen.

Wenn du es so machst, wie du es beschrieben hast, überschreibst du ja schon werte in deiner matrix. An die kommst du später nicht mehr ran.
also musst du dir eine zweite matrix erstellen, in der du die transponierte matrix reinschreibst.

@ Hoask:
Es soll ja eine quadratische matrix sein.
Ich würde folgendes machen:

1. Zeilenanzahl in eine variable (zb: n) speichern
2. n mit der Spaltenanzahl vergleichen
3. eine neue matrix der größe n*n erzeugen.

wenn die anzahl der zeilen und spalten schon nicht übereinstimmt kannst du schon abbrechen.
(zumindest für diese aufgabe) :wink:


----------



## Gast (11. Dez 2005)

Danke für die Antworten, die haben schon sehr geholfen, aber gibt es auch eine Möglichkeit die transponierte Matrix zu bekommen ohne ein neues Array zu benutzen?


----------



## Maximum (11. Dez 2005)

Nein :wink:


----------



## Lim_Dul (11. Dez 2005)

Maximum hat gesagt.:
			
		

> Nein :wink:



Doch

Du gehst einfach die obere Dreiecksmatrix um und vertauscht dann den Eintrag (j,i) mit dem Eintrag (i,j). Dann brauchst du keine weitere Matrix.


----------



## Gast (11. Dez 2005)

aber es MUSS eine Möglichkeit geben!! zumindest nach meiner Aufgabenstellung, aber ich glaube das reicht auch,
nochmals vielen Dank!


----------



## Gast (11. Dez 2005)

ich verstehe leider nicht ganz, welche Dreiecksmatrix? und (j,i) und (i,j) habe ich doch auch schon vertauscht!?


----------



## Maximum (11. Dez 2005)

Oh.. das tut mir leid, dass ich da eine falsche antwort gegeben habe.  



> Du gehst einfach die obere Dreiecksmatrix um und vertauscht dann den Eintrag (j,i) mit dem Eintrag (i,j). Dann brauchst du keine weitere Matrix.



Kannst du mir das nochmal erklären.. Ich blick da nicht so durch was du mit "du gehst die obere Dreiecksmatrix um.. " meinst  ???:L


----------



## HAOSK (11. Dez 2005)

Hi,

Matrix siet so aus:

| a1 a2 a3 a4 a5 |
| b1 b2 b3 b4 b5 |
| c1 c2  c3 c4 c5 |
| d1 d2 d3 d4 d5 |
| e1 e2 e3 e4 e5 |

mit einer Variablen n kannst du
a2 und b1 vertauschen. Weiter geht's mit 
a3<=>c1;a4<=>d1;b3<=>c2;a5<=>e1;b4<=>d2;usw...

Dreiecksmatrix => a1..a5; a1..e1; => somit ein Dreieck...


----------



## Lim_Dul (11. Dez 2005)

Achtung, der Code ist nicht getestet, sondern nur runtergetippt hier im Forum.


```
public void transpose ( int[][] matrix, int n) {
  for (int i = 0; i < n; ++i) {
    for (int j = i+1; j < n; ++j) {
      int x = matrix[i][j];
      matrix[i][j] = matrix[j][i];
      matrix[j][i] = x;
    }
  }
}
```


----------



## Maximum (11. Dez 2005)

*aua*
ja klar  :lol: 
Zu dumm, dass ich da nicht selber drauf gekommen bin.


----------



## Guest (11. Dez 2005)

Vielen dank für die Antworten!
Aber warum schreibst du in der 2 forschleife
int j = i+1 ?


----------



## Gast (11. Dez 2005)

und ist diese Zuweisung wirklich in Ordnung:
int x = matrix_[j];  ??????????ß_


----------



## Lim_Dul (11. Dez 2005)

Gast hat gesagt.:
			
		

> und ist diese Zuweisung wirklich in Ordnung:
> int x = matrix_[j];  ??????????ß_


_

Warum nicht? in matrix[j] steht ein int wert drin, denn kann ich auch in einer andern Variablen speichern.



			
				Anonymous hat gesagt.:
			
		


			Vielen dank für die Antworten!
Aber warum schreibst du in der 2 forschleife
int j = i+1 ?
		
Zum Vergrößern anklicken....


Weil ich verhindern will, dass Sachen doppelt bearbeitet werden, ich gehe nur die obere Dreeicksmatrix durch (oder die untere, je nach dem, wie man die Indizes versteht)

Die Diagonale einer Matrix wird ja durch das Transponieren nicht verändert. Ergo muss j = 1 nicht betrachtet werden. (Deshalb das +1)
Und wenn das Element i = 1, j = 2, also matrix[1][2] mit dem Element matrix[2][1] vertauscht wird, dann sollte man diese Vertauschung nicht nochmal durchführen, sonst hat man die Ursprüngliche Matrix wieder.

Am besten malst du dir mal eine Matrix auf und gehts den Algorithmus Schritt für Schritt durch. (3x3 ist zu empfehlen)
Dann sollte es klarer werden._


----------



## HAOSK (11. Dez 2005)

Hi,
die Zuweisung ist OK, denn in Matrix_[j] ist ja ein int gespeichert, was die zweite for-Schleife betrifft,  mit j = i + 1 könntest du ein Bischen Rechenpower sparen...
matrix[0][0] = matrix[0][0] ist ja Blödsinn an sich..._


----------

