Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Algorithmen (http://www.informatikerboard.de/board/board.php?boardid=17)
----- C# Determinante bestimmen (http://www.informatikerboard.de/board/thread.php?threadid=2186)
Geschrieben von dennii09 am 21.03.2015 um 10:29:
C# Determinante bestimmen
Meine Frage:
Hallo,
und zwar möchte/soll ich die Determinanten von Matritzen bestimmen.
Ich möchte dies gerne über for-Schleifen machen, da ich finde, dass man es dadruch bestimmt am einfachsten hat.
Jedoch bin ich mir nicht ganz sicher, wie ich es mache. Für eine 2x2 Matrix habe ich es hinbekommen. Für eine 3x3 Matrix steht mir auch eine Idee im Kopf, jedoch ist der Rechnenweg mir zu lang und ich glaube es gehe auch kürzer.
Mein Code für die 2x2 Matrix sieht so aus, dass ich zwei for-schleifen mache, und eine Variabel soll die Zeilen, die andere die Spalten abarbeiten. Da die Schleifen ja die Variabeln mehrmals durchlaufen, ich aber nur einen Durchlauf benötige unterbreche ich die Schleifen einfach.
Könnt ihr mir helfen, wie man es 1. besser und 2. für eine 3x3 oder höhere Matrix machen kann?
Vielen Dank für eure Hilfe
Meine Ideen:
int[,] matrix = { { 2, 2 }, { 2,10} };
for(int i = 0;i<=matrix.GetLength(0)-1;i++)
{
for(int j=0;j<=matrix.GetLength(1)-1;j++)
{
int s1 = matrix[i, 0]*matrix[i+1,j+1]-matrix[i+1,j]*matrix[i,j+1];
Console.WriteLine(s1);
break;
}
break;
Geschrieben von eulerscheZahl am 21.03.2015 um 11:10:
Für 3x3 gibt es noch Sarrus, für höhere Ordnungen hilft Rekursion.
Du wirst aber recht schnell an die Grenzen kommen, wenn du es mit Unterdeterminanten angehst. Ich würde dir Gauss empfehlen, damit kriegst du es in annehmbarer Zeit hin.
Ich habe das vor einiger Zeit schonmal hier geschrieben, [
C# IndexOutOfRangeException Problem]LINK[/URL].
Habe es mal auf dein Problem angepasst:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
private static double Determinante(double[,] matrix) {
int n = matrix.GetLength (0);
for (int i = 0; i < n; i++)
{
if (matrix[i, i] == 0)
{
for (int zeile=i; zeile<n; zeile++) {
if (matrix [i, zeile] != 0) { //zeile tauschen
for (int k = 0; k < n; k++) {
double tmp = matrix [k, i];
matrix [k, i] = matrix [k, zeile];
matrix [k, zeile] = tmp;
}
}
}
}
if (matrix[i, i] == 0) continue;
for (int j = i + 1; j < n; j++)
{
//0er erzeugen durch Addition
double faktor = -matrix[j, i] / matrix[i, i];
for (int k = 0; k < n; k++) {
matrix [j, k] += faktor * matrix [i, k];
}
}
}
double result = 1;
for (int i = 0; i < n; i++) {
result *= matrix [i, i];
}
return result;
} |
|
Geschrieben von dennii09 am 21.03.2015 um 11:42:
Puh, dass ist erstmal ein großer Brocken für einen, der die Informatik noch nicht so beherrscht. Na gut aber ich werde es schon hinbekommen.
Ich habe allerdings eine Frage bezüglich des Abschnitts, wo der Zeilen Tausch stattfindet. Kannst du mir den mal erklären, wie ich mir das vorstellen kann auch bezüglich der Schleifen?
Vielen Dank für deine Antwort und den Code.
Geschrieben von eulerscheZahl am 21.03.2015 um 11:55:
Ich tausche die Zeilen
i[/i] und [b]zeile miteinander.
Mit
k gehe ich die Spalten durch (ich stelle gerade fest, hier könnte ich auch bei i starten, statt bei 0).
Wenn ich den Wert der einen Zeile mit dem aus einer anderen überschreiben will, ist der erste Wert futsch, daher das Zwischenspeichern in
tmp.
Bist du vertraut mit dem
Gauß Algorithmus? Sonst würde ich dir raten, erst das Verfahren zu verstehen und dann den Code durchzulesen. Im Wikipediaartikel ist noch ein b auf der rechten Seite der Gleichung. Wenn du dir das wegdenkst und dann bei der Dreiecksmatrix das Produkt der Hauptdiagonalen bildest, hast du den Wert der Determinanten.
Edit: um meinen Code zu verstehen, reicht es, wenn du in der wikipedia Kapitel 1.1 liest.
Geschrieben von dennii09 am 21.03.2015 um 12:07:
Ja mit dem Gauß-Algorithmus bin ich vertraut. Nur es in einen Quellcode zu schreiben braucht dann doch noch bisschen mehr. Aber danke für die Antwort hat mir auf jedenfall sehr geholfen und ich hoffe, dass ich damit dann auch Rechnungen oberhalb 3x3 Matrizen berechnen kann, indem ich deinen Code erweitere.
Vielen Dank für deine Hilfe.
Forensoftware: Burning Board, entwickelt von WoltLab GmbH