Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » C-golf (determinante)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
01.07.2003, 20:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
Hab ich die Aufgabe so unverständlich formuliert? oder wir reden aneinander vorbei.

Ich meinte in meiner Aufgabenstellung einen Algorithmus der die Determinante einer quadratischen Matrix beliebiger Grösse nXn berechnet wobei nur gelten sollte n>1;

Für dies habe ich eine Lösung, allerdings ist die nur für n<=12 sinnvoll weil der sonst zu lange rechnet.

Oder was meintest du jetzt. Lies mal bitte den ganzen Thread bevor du antwortest damit wir nicht wieder aneinander vorbeireden.

Wenn ich mich nicht irre geht Sarrus nur für 3er Matrizen oder?

Oder wolltest du jetzt einfach nur darauf hinweisen das der Aufwand scheisse ist? Das weiss ich auch. Gibt es da nen Algo wie man das besser machen kann?

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
01.07.2003, 21:14 Uhr
Pablo
Supertux
(Operator)


Ich glaube, wie reden quasi aneinander vorbei. Ich habe gemeint, die Aufgabe war ursprünglich nur für 3x3 Matrizen, deshalb habe ich das gepostet.

Sarrus ist nicht nur für 3x3 Matrizen, Sarrus ist eigentlich die erste Definition einer Determinante, die es gab. Denn beim Sarrus gilt, dass det(A) = Summe über alle Permutationen delta(i), mit dem Signum der Permutation, und das gilt für alle quadratische Matrizen. Und der Aufwand für Sarrus ist schon scheiße, aber wenn man geschickt nach Zeilen entwickelt, kann man für sehr große Matrixen schnell lösen, vor allem, wenn ich nach einer Zeile oder Spalte entwickle, die am meisten 0 hat, und das beschleunigt dieses Verfahren.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
01.07.2003, 21:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
OK, ein Danke an den Mathemathiker.

So tief bin ich da als BWLer nicht eingestiegen. Muss ich mir mal bei Gelegenheit anschaun wie man den Algo optimiert.

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
02.07.2003, 11:15 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Na gut, da anscheinend keiner weiter mitspielen will.
Hier meine Lösung

C++:
double det(double*m,int n){double*h,r=m[0]*m[3]-m[1]*m[2];int i,j,k,x=n-1,b=1;if(n-2){r=0;for(i=-1;++i<n;b=-b){h=new double[x*x];for(j=0;j<x;j++)for(k=0;k<x;k++)h[k+j*n-j]=m[(k<i?0:1)+n+k+j*n];r+=b*m[i]*det(h,x);delete[]h;}}return r;}



und noch mal in lesbarer Form

C++:
double det(double*m,int n){
double*h,r=m[0]*m[3]-m[1]*m[2];
int i,j,k,x=n-1,b=1;
if(n-2){
    r=0;
    for(i=-1;++i<n;b=-b){
        h=new double[x*x];
        for(j=0;j<x;j++)
            for(k=0;k<x;k++)
                h[k+j*n-j]=m[(k<i?0:1)+n+k+j*n];
        r+=b*m[i]*det(h,x);
        delete[]h;
    }
}
return r;
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.07.2003 um 11:17 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
02.07.2003, 11:28 Uhr
~karl-heinz-otto
Gast


I'm still waiting for it...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
02.07.2003, 11:43 Uhr
~karl-heinz-otto
Gast


hab dass mal ausprobiert. bei mir funktioniert dass nicht.
du erwartest schon in deiner funktion die Anordnung der elemente wie auf seite 1 in main() bei dir?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
02.07.2003, 14:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Jupp wie in der aufgabenstellung beschrieben stehen die Elemente der Matrix zeilenweise im array.

Bei mir funzt das?

was sagt er denn bei dir?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
02.07.2003, 16:05 Uhr
~karl-heinz-otto
Gast


ich hab dein main vorne mit deiner lösung genommen.

bei mir gibt er immer aus, "das geht nicht".
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
02.07.2003, 16:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@karl-heinz-otto
Sicher? kopier dir mal das hier und compilier mal, vielleicht hast du beim copy und paste ja was weggelassen.
ich habs eben noch mal getestet und bei mir gehts.
Wenn nicht lass dir den wert von den der ausrechnet mal anzeigen.


C++:
#include "stdio.h"

double det(double*m,int n){
double*h,r=m[0]*m[3]-m[1]*m[2];
int i,j,k,x=n-1,b=1;
if(n-2){
    r=0;
    for(i=-1;++i<n;b=-b){
        h=new double[x*x];
        for(j=0;j<x;j++)
            for(k=0;k<x;k++)
                h[k+j*n-j]=m[(k<i?0:1)+n+k+j*n];
        r+=b*m[ i ]*det(h,x);
        delete[]h;
    }
}
return r;
}


int main(){
double *matrix=new double[3*3];
//erste Zeile
matrix[0]=1;
matrix[1]=2;
matrix[2]=-2;
//zweite Zeile
matrix[3]=1;
matrix[4]=2;
matrix[5]=1;
//dritte Zeile
matrix[6]=-1;
matrix[7]=3;
matrix[8]=1;

if(det(matrix,3)==-15) printf("super scheint zu funktionieren\n");
else printf("Pech gehabt nochmal versuchen\n");
delete [] matrix;
return 0;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
02.07.2003, 20:54 Uhr
Pablo
Supertux
(Operator)


Ayayay.....
Sieht so aus, als hätte ich doch einen kleinen Fehler gemacht, und Heiko hatte Recht. Sarrus ist nur für 3x3 Matrizen anwendbar. Ich hab den Namen verwechselt. Im Prinzip ist das gleiche aber, die Definition der Determinante einer nxn Matrix ist die Summe über alle Permutationen, usw....
Um zu beweisen, dass was Sarrus macht, die tatsächliche Determinante ist, muss man nur alle Permutationen der Fole (1, 2, 3) ausrechnen und sie summieren. Deshalb gibt es genau 6 Summanden beim Sarrus, weil 3! = 6
Die Determinante ist:

|a_11 a_12 a_13|
|a_21 a_22 a_23| =
|a_31 a_32 a_33|

a_11 * a_22 * a_33 + a_12*a_23*a_31 + a_13*a_21*a_32 - a_31*a_22*a_13 - a_32*a_23*a_11 - a_33*a_21*a_12

Beweis: Alle Permutationen für die Folge 1,2,3 sind:
1,2,3 (signum = 1)
2,3,1 (signum = 1)
3,2,2 (signum = 1)
3,2,1 (signum = -1)
1,3,2 (signum = -1)
2,1,3 (signum = -1)

wenn man die Koeffizienten von Sarrus mit dem Vorzeichen und die Permutationen vergleicht, wird feststellen, dass sie gelich sind, q.e.d.

Sorry für die falsche Antwort, aber was ich jetzt sage, ist doch richtig!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 02.07.2003 um 20:54 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: