Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Matrix invertieren

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 ]
000
04.07.2003, 13:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Beefy hat mich auf die Idee gebracht das man ja noch ne Matrix invertieren könnte
deswegen folgendes Rätsel:

C++:
void matrix_inv(double*m,int n);



m: die zu invertierende Matrix
n: dimension der quadratischen Matrix.
nach dem ausführen der funktion steht in m die invertierte Matrix.

Für die die es nicht wissen: Das Produkt der einer Matrix mit seiner Invertierten ergibst die Einheitsmatrix.

Einheitsmatrix ist die Matrix die nur aus Nullen besteht ausser auf der Diagonalen sind einsen.
Habs selber noch nicht geproggt. Mal gucken ob ichs hinbekomme mach mich gleich mal dran

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

Dieser Post wurde am 04.07.2003 um 13:36 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.07.2003, 13:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Habe gerade mal gegoogelt und eine Lösung für ne zu invertierende Matrix gefunden


C++:
int main(){

int i,j,n=3;

double *matrix=new double[n*n];

matrix[0]=-1;
matrix[1]=-2;
matrix[2]=0;

matrix[3]=-2;
matrix[4]=3;
matrix[5]=-3;

matrix[6]=0;
matrix[7]=3;
matrix[8]=3;

matrix_inv(matrix,n);

    for(j=0;j<n;j++){
        for(i=0;i<n;i++)
            printf("%0.2f\t",matrix[i+j*n]);
        printf("\n");
    }

delete [] matrix;
}



wenn der euch folgendes ausschmeisst scheint euer algo zumdinest für diese Matrix zu funktionieren
-0.60 -0.20 -0.20
-0.20 0.10 0.10
0.20 -0.10 0.23
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 04.07.2003 um 13:42 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.07.2003, 13:44 Uhr
daredevil
Speicherteufel


hast du auch ein beispiel, wie man eine matrize invertiert?
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.07.2003, 13:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


habs gerade hinbekommen
Ich habs nach dem schema hier gemacht.

hast du vom integrieren die schnauze voll?
Ist aber viel leichter als das invertieren

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

Dieser Post wurde am 04.07.2003 um 14:00 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.07.2003, 14:20 Uhr
daredevil
Speicherteufel


ich kann integrieren nicht, aber ich werds bald lernen müssen...
ich glaub ich lass das mit dem invertieren, ist mir zu denkaufwendig.

naja, dann wart ich mit freude auf neue rätsel, oder ich stell selber mal welche...
--
tschüss,
DareDevil

Dieser Post wurde am 04.07.2003 um 14:24 Uhr von daredevil editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2003, 18:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Meine Lösung dazu:


C++:
void matrix_inv(double*m,int n){
int i,j,k;
double    h,*mat=new double[n*n];
    
    for(j=0;j<n;j++)for(i=0;i<n;i++)mat[i+j*n]=i!=j?0:1;

    for(j=0;j<n;j++){
        h=m[j*n+j];
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}
        for(i=0;i<n;i++)
            if(i!=j && m[i*n+j]!=0){
                h=-m[i*n+j];
                for(k=0;k<n;k++){m[k+i*n]+=h*m[k+j*n];mat[k+i*n]+=h*mat[k+j*n];}  
            }
    }
    memcpy(m,mat,n*n*sizeof(double));
    delete [] mat;
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.12.2003, 14:30 Uhr
~Fozzi
Gast


Hallo,
ich wollte nur anmerken, daß der obige Algorithmus nur in manchenfällen
die richtige Lösung liefert.
Leider funktioniert er oft nicht, z.B. für

double mat [16] = {0,-1,0,1,-1,0,0,1,1,1,0,-1,1,1,1,-2}

eigentlich sollte als Lösung herauskommen :

/--- ---\
| 1 0 1 0 |
| 0 1 1 0 |
| 1 1 0 1 |
| 1 1 1 0 |
\--- ---/

Leider kommt statt dessen für jeden Eintrag inf oder nan heraus

Gruss
Carsten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.12.2003, 15:04 Uhr
kronos
Quotenfisch
(Operator)


hmm, wie multipliziert man zwei matrizen?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.12.2003, 15:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@kronos
das sollte dir helfen

@Fozzi
mmh ich habs nicht weiter getestet gehabt aber ich glaub ich weiss schon woran das liegt (das sind die dummen Nullen durch die man dann teil, das muss man verhindern vermutlich durch umsortieren der matrix und am ende wieder zurücksortieren...). Ich muss mal schauen ob ichs hinbekomme und ob das überhaupt so geht wie ich mir das vorstelle...ist ein wenig tricky die ganze sache...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.12.2003, 17:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so musste erstmal mein Motorrad wieder reparieren so lange es noch hell war

hab mir den algo gerade nochmal angeguckt..
hab tatsächlich was vergessen. hab das schnell noch implementiert aber noch nicht getestet sollte aber hoffentlich funzen. Was auf jeden fall nicht funzt ist, wenn man die matrix nicht invertieren kann. das kann man vorher durch die berechnung der determinante abchecken ob sie überhaupt invertierbar ist.... (oder man jagt den alog rüber und guckt nach ob unendlich drin steht ist natürlich auch ne möglichkeit....

auf jeden fall kann man im moment noch keinen schönheitspreis mit gewinnenaber egal ich poste einfach mal..

C++:
void matrix_inv(double*m,int n){
int i,j,k;
double h,*mat=new double[n*n];
    
    for(j=0;j<n;j++)for(i=0;i<n;i++)mat[i+j*n]=i!=j?0:1;

    for(j=0;j<n;j++){
        if(!m[j*n+j])   //das hier hat gefehlt man muss quasi switchen wenn der ne zeile mit ner 0 an der stelle hat wo der normieren soll
            for(k=j+1;k<n;++k)
                if(m[k*n+j]){
                    for(i=0;i<n;++i){
                        h=m[j*n+i];m[j*n+i]=m[k*n+i];m[k*n+i]=h;
                        h=mat[j*n+i];mat[j*n+i]=mat[k*n+i];mat[k*n+i]=h;
                    }
                    break;
                }
        h=m[j*n+j];
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}
        for(i=0;i<n;i++)
            if(i!=j && m[i*n+j]!=0){
                h=-m[i*n+j];
                for(k=0;k<n;k++){m[k+i*n]+=h*m[k+j*n];mat[k+i*n]+=h*mat[k+j*n];}  
            }

    }
    memcpy(m,mat,n*n*sizeof(double));
    delete [] mat;
}



@Fossi
da hast du sehr gut aufgepasst.... danke
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.12.2003 um 17:19 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: