C# Determinante bestimmen |
dennii09
Grünschnabel
Dabei seit: 21.03.2015
Beiträge: 3
|
|
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;
|
|
21.03.2015 10:29 |
|
|
|
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;
} |
|
__________________ Syntax Highlighting fürs Board (Link)
|
|
21.03.2015 11:10 |
|
|
dennii09
Grünschnabel
Dabei seit: 21.03.2015
Beiträge: 3
|
|
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.
|
|
21.03.2015 11:42 |
|
|
dennii09
Grünschnabel
Dabei seit: 21.03.2015
Beiträge: 3
|
|
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.
|
|
21.03.2015 12:07 |
|
|
|