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 ]
010
21.12.2003, 18:10 Uhr
RedEagle



@Windalf
Wenn du hinter jedem } einen Kommentar schreibst, indem steht, zu welcher schleife die } gehört, währe der Code wesentlich übersichtlicher.
z.B.

C++:
if (x = y)
{
x-y;
} //(x = y)


--
MFG RedEagle

Dieser Post wurde am 21.12.2003 um 18:10 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
21.12.2003, 18:17 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also dein bedingung if(x=y) ergibt immer true wenn y!=0 ist

was du meinst ist vermutlich if(x==y)...

zum anderen war das ja ein rätsel warum sollte ich da meine lösung auch noch gross erklären? Ihr könnt ja mal ein paar Lösungen anbieten....

Ausserdem find ich den code so übersichtlich ich hasse das wenn unnötig viele klammern verwendet werden (ist halt geschmacksache)... Ich finde das dann unübersichtlicher....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
22.12.2003, 10:30 Uhr
derphilipder



@Windalf

Hab mir das nicht so genau angeschaut, aber berücksichtigst Du auch den Fall, wenn die Determinante 0 ist?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
22.12.2003, 14:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@derphilipder
nein musst du selber machen da hab ich doch schon ein anderes rätsel mal zu gemacht
einfach vorher die determinante ausrechnen lassen und schon weisst du es...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
22.12.2003, 19:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


kann sein das folgende erweiterung abfängt ob eine matrix nicht invertierbar ist (wäre wesentlich performanter als eine determinante zu berechnen), aber wie immer ohne garantie....
wäre geil wenn sich das mal ein mathestudent angucken könnte und ein paar takte dazu sagen würde...

C++:
bool matrix_inv(double*m,int n){
int i,j,k;
double h,*mat=new double[n*n];
    
    //Array mit Werten einer Einheitsmatrix erzeugen
    for(j=0;j<n;j++)for(i=0;i<n;i++)mat[i+j*n]=i!=j?0:1;

    //für jede Zeile der Matrix
    for(j=0;j<n;j++){
        k=0;
        if(!m[j*n+j])    //wenn das zu normierende element 0 ist zeilentausch
            for(k=j+1;k<n;++k)    //für jede zeile nach der jten
                if(m[k*n+j]){    //wenn element ungleich 0 gefunden zeilen tauschen und schleife abbrechen
                    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;
                }
        if(k==n)return false;
                    
        h=m[j*n+j];//wert des zu normierenden elements
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}//die komplette zeile normieren
        for(i=0;i<n;i++)// gauss über die matrix jagen
            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));//invertierte matrix in übergebenen speicher schreiben
    delete [] mat;
return true;
}


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

Dieser Post wurde am 22.12.2003 um 19:07 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
28.12.2003, 23:17 Uhr
(un)wissender
Niveauwart


Mir fiel gerade auf, das, wenn du return false machst, du einen memory leak hast, da du mat nicht löschst.
Der Algo schaut auch etwas kompliziert aus, ich glaube da kann man noch einen Menge sparen, vielleicht setzte ich mich mal dran.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
29.12.2003, 13:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
das kommt wohl davon wenn man zuschnell irgendwas ändert ohne gross drüber nachzudenken....
vielen dank für diesen hinweis... das mir das mit dem speicherfreigeben auch wieder passieren musste obwohl ich jedem neuling predige er soll das nicht vergessen...

viel einfach wirst du das wahrscheinlich auch nicht hinbekommen
man könnte statt der schleifen einen memcpy machen...

hierdran gibt es nicht viel zu sparen das ist einfach der Gauss.....

C++:
h=m[j*n+j];//wert des zu normierenden elements
        for(k=0;k<n;k++){m[k+j*n]/=h;mat[k+j*n]/=h;}//die komplette zeile normieren
        for(i=0;i<n;i++)// gauss über die matrix jagen
            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));//invertierte matrix in übergebenen speicher schreiben
    delete [] mat;




Sparpotenzial wäre hier...

C++:
//für jede Zeile der Matrix
    for(j=0;j<n;j++){
        k=0;
        if(!m[j*n+j])    //wenn das zu normierende element 0 ist zeilentausch
            for(k=j+1;k<n;++k)    //für jede zeile nach der jten
                if(m[k*n+j]){    //wenn element ungleich 0 gefunden zeilen tauschen und schleife abbrechen
                    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;
                }
        if(k==n)return false;


wenn man mit ein 2d-array arbeiten würde wäre das vertauschen der zeilen wesentlich einfach da man nur die pointer vertauschen müsste (da hätte beefy dann ausnahmsweise mal mit seinem mehrdimensionalen Fimmel die Nase vorn...)

ok der patch sieht dann natürlich folgendermaßen aus:

C++:
if(k==n){delete [] mat; return false;}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
29.12.2003, 22:25 Uhr
erpelqueen
Entlein


Nur mal so, was ist eine Matrix?
Und was bringt es, die zu invertieren?
--
TSchöööööööö ,
How dy How, Ranger Joe
--------------------------------------
www.erpelstore.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
29.12.2003, 22:56 Uhr
Pablo
Supertux
(Operator)


Ein Matrix ist ein quadratischen Scheme mit Zahlen als Einträge. Stell dir vor eine 2-dim. Array mit Dimension 2x2. Das kann man auch als Matrix interpretiert werden.

Eine Matrix ist nichts anderes als eine lineare Abbildung. Was ich damit meine ist folgendes: Du kennst was eine Funktion ist, z.b. die quadratische Funktion f(x) = x². Diese Funktion ordnet jeder Zahl x eine entsprechende Zahl zu, und zwar (in diesem Fall) das Quadrat der Zahl. Als f(0)=0, f(1)=1, f(2)=4, f(3)=9, usw.

Stell dir die Funktionen als eine Maschine, die Zahlen verarbeitet und Zahlen als Ergbnis spuckt. Nun, die Funktion ist aber eine eindeutige Zuordnung, d.h. eine Funktion kann mehrer Zahlen als Eingabe bekommen, aber kann nur eine einzige Zahl spucken, d.h. Sachen wie f(2) = 6 oder 7 gibt es nicht.

Ein Vektor ist wie eine mehrfach-dimensionale Zahl. Z.b. ein Pfeil in dem Raum ist ein Vektor in 3 Dimensionen, um deinen Pfeil im raum zu platzieren, musst du die Länge, Höhe und Tiefe angeben. Z.b. (1,1,1). Wenn du ein Würfel hättest mit 1x1x1 cm, dann ist der Vektor (1,1,1) die Diagonale des Würfels. Ein Vektor kann verlängert, verschoben, gedreht und gespiegelt (bzgl Achsen) werden. Und wenn man einen Vektor verlängert oder dreht, bekommt man einen neuen Vektor. Also sind Verlängerungen, Spiegelungen, Drehungen, und Verschiebungen Funktionen (sie heißen Ähnlichkeitsabbildungen). Diese Funktionen arbeiten wie die obene genannten Funktion und der Unterschied liegt darin, dass solche Funktionen (oder auch lineare Abbildungen genannt) Vektoren statt Zahlen bekommen und Vektoren auspucken.

Nun, da ein Vektor über mehr als eine Dimension verfügt, ist dann nicht so einfach eine solche Funktion aufzuschreiben, wie f(x)=x². Dafür hat man die Matrizen. Die Matrizen entsprechen diesen Funktionen. Wenn man eine Matrix mit einem Vektor multipliziert (dafür gibt es bestimmte Regeln) bekommt man nochmal einen Vektor. Wenn die Matrix eine Verschiebungsmatrix ist, dann bekommst de verschiebung des Vektors, mit dem du die Matrix multipliziert hast.

Die Inverse Matrix B eine Matrix A ist die Matrix, für die gilt: A*B = E. E heißt hier die Einheitsmatrix, und diese Matrix hat überall 0 außer in der Diagoanle. Die Diagonale hat nur 1.

1 0 0
0 1 0
0 0 1
ist die Einheitsmatrix der Matrizen mit 3x3 Dimensionen.
Diese Einheitsmatrix ist cool, denn sie verhält sich bzgl. Matrizen und Vektoren genauso wie de Zahl 1. Die Multiplikation mit der Zahl 1 ergibt immer die andere Zahl, d.h 5*1 = 5, 7*1 = 7. Wenn du eine Matrix A hast und sie mit E (Einheitsmatrix) multiplizierst, bekommst du wieder A, also, A*E = A; B*E=B, usw.

In der Mathematik (speziell in der Linearen Algebra) betrachtet man die Matrizen als Zahlen. Und so wie für 6 und 1/6 die Zahl ist, für die gilt: 6*1/6 = 1 hat man für Matrizen die Inverse Matrix, so dass gilt: A*B = E.


Zitat:
erpelqueen postete
Und was bringt es, die zu invertieren?


Was das bringt ist schwer in kurzen Sätzen zu erklären. Dafür musst du einigen Sachen der Mathematik kennen, die nicht so trivial sind. nd ich glaube, jetzt ist nicht die Zeit sie zu verstehen und glaube auch, dass du es vielleicht nicht verstehst. Wenn man die Menge der reelen Zahlen (alle Zahlen) betrachtet, kann man sagen, das mit + und * ein Körper ist, weil es bestimmte Eigenschaften erfüllt (Assoziativiät, Kommutativität, Existenz des Inverses Elementes, usw.). Wenn man die Menge der 3x3 Matrizen betrachtet, mit + und * (+ und * bzgl Matrizen) ist diese Menge kein Körper, weil es Eigenschaften des Körpers nicht erfüllt sind, zb. nicht jede Matrix kann invertiert werden.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 29.12.2003 um 23:01 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
30.12.2003, 03:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@erpelchen
Ich vermute mal du wirst Pablos Roman nicht verstehn...,deshalb setze ich selber mal einen auf....

Ich versuch mal ganz einfach zu erklären....(so das sich jeder Mathematiker die Haare raufen würde...)

Was du schon in der Schule gelernt haben müsstest...:

Die Null ist neutrales Element bezüglich der Addition

wenn ich eine Zahl mit ihrem inversem Element addiere kommt das neutrale raus
Beispiel 3+x = 0
x ist in diesem falle dann -3 und das ist das inverse Element zur 3 bezüglich der addition

Analog ist das dann auch mit der Multiplikation. Da ist das neutrale Element dann 1 und das inverse Element eine Zahl immer ihr Kehrwert....

also beispiel zur 3 ist das inverse element dann 1/3 weil 3*1/3 = 1 ist....

Hier gibt es dann den Fall 0.... zur Null gibt es kein Inverses Element (bei der multiplikation) weil man durch Null nicht teilen darf (man könnte auch sagen das inverse Element bezüglich der Multiplikation bei der Null Unendlich ist....)
Die Frage wäre also mit welcher Zahl muss ich Null Multiplizieren damit 1 raus kommt...

Bei der Matrix ist das relativ ähnlich (auch hier kann es sein das es keine Lösung gibt...)

Ich sage die Einheitsmatrix (das ist die wo alle Elemente der Matrix 0 sind und nur die Zahlen auf der Diagonalen sind 1, Pablo erwähnte das bereits oben) ist quasi mein "Neutrales Element"

Nur habe ich eine Matrix und suche zu dieser die Inverse.
Es soll gelten das Matrix mit ihrer Inversen verknüpt die Einheitsmatrix ergibt... Ist also ziemlich analog zu dem was du bisher in der Schule gelernt hast nur ein wenig komplizierter....
--
...fleißig wie zwei Weißbrote
 
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: