Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Übertragung von C++source in C-source

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 < [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]
030
04.01.2004, 20:03 Uhr
Lumina



@ 0xdeadbeef:

Gut aufgepasst!
Nur gibt es da ein kleines Problem, denn wenn von mir verlangt wird, dass ich statt matrix[100], also einem 1-dim Array ein 2-dim Array mache (matrix[10][10]), dann geht logischerweise nix mehr mit dem Source von Windalf. Habs auch noch nicht geschafft, den so anzupassen...

Possible?
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
04.01.2004, 20:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Was denkst du ist die beste Möglichkeit, eine Matrix zu invertieren? Schon auch mit der Determinante oder? Oder soll ich mich da auch an deinem Rätsel orientieren...


Ich bin nur BWLer und kein Mathematiker.... soviel mal dazu um meiner jetzigen Aussage gewicht zu verleihen..

Ich weiss nicht was es alles für möglichkeiten gibt eine Matrix zu Invertieren. (Ich habe nur in Google MAtrix invertieren eingegeben und habe mir dann die seite dazu angeguckt wie das bei dem einem Beispiel geht und das dann auf die schnelle implementiert) Soll heissen ich weiss zwar wofür man eine Matrix invertiert bin aber nicht in die Tiefen der Mathematik eindgedrungen noch habe ich den Algo 100%ig bis in alle Ausnahmen und Details verstanden...

Ich würde sagen das es sinnvoller ist das mit dem Algo zu machen den ich im Rätsel implementiert habe weil der wesentlich performanter ist als eine Determinantenberechnung...

Vorteil von diesem ganzen Kramerschen Regel Krempel ist das das ja auch teilweise für nicht lineare Gleichungssysteme funzt.... Macht aber nur mehr Aufwand....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
04.01.2004, 20:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Gut aufgepasst!
Nur gibt es da ein kleines Problem, denn wenn von mir verlangt wird, dass ich statt matrix[100], also einem 1-dim Array ein 2-dim Array mache (matrix[10][10]), dann geht logischerweise nix mehr mit dem Source von Windalf. Habs auch noch nicht geschafft, den so anzupassen...
Possible?



klar ist easy....

machs am besten so...
entscheide dich dafür entweder alles mit 1d oder 2d matrizen zu machen oder du hällst jede matrize dopplet speicher vor

int der art

C++:
typedef struct{double *1d_matrix;double **2d_matrix;int n} matrix;


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

Dieser Post wurde am 04.01.2004 um 20:13 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
04.01.2004, 20:15 Uhr
Pablo
Supertux
(Operator)


Invertierbarkeit mit der Determinante hat wenig miteinander, außer dass eine nxn-Matrix ganau dann sich invertieren lässt, wenn die Determinante nicht 0 ist. Und somit bilden Matrizen mit det!=0 bestimmte Gruppen, wie O(n), GLn, usw. Solche Matrizen haben zusätzlich Determinante 1 oder -1. Jetzt weiß ich es nicht mehr ganz genau, das habe ich letztes Semester gemacht, aber es war so viel, dass ich es schon vergessen hab, müsste ich langsam wiederholen, weil ich mich da mündlich prüfen lassen will

@Windalf: ja, eine 1x1 Matrix ist nennt sich auch Matrix. f(x) = x ist eine Matrix, oder f(x)=2x lässt sich ebenfalls als Matrix darstellen, nämlich als (1) oder (2). Die Determinante ist ungleich null, deshabl kann man sie invertieren und gilt a*a/x = 1, außer für a=0. Das ist in Prinzip das Ziel der Linearen Algebra, zu erklären, dass alle linearen Funktionen als Matrizen geschreiben werden können.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 04.01.2004 um 20:18 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
04.01.2004, 20:41 Uhr
0xdeadbeef
Gott
(Operator)


@Lumina: Wenn ich dir nen Tip geben darf - ich würde an deiner Stelle Im Zweifel eher mit Pointer-Pointern arbeiten. Das macht bei weiterer Matrix-Verarbeitung die Pivot-Geschichte deutlich einfacher, und der Code wird besser lesbar. Am besten ein struct der Art:

C++:
typedef struct {
  double **feld;
  int m, n;
} matrix;


Der Nachteil dieses Ansatzes ist natürlich, dass der Speicher auf dem Heap angelegt und von Hand wieder freigegeben werden muss, aber für meinen Geschmack wiegen die Vorteile die Nachteile auf. Du kannst das ja in Funktionen kapseln:

C++:
matrix calloc_matrix(matrix mat, int m, int n) {
  int i;
  
  mat.feld = calloc(m, sizeof(double*));
  for(i = 0; i < m; ++i)
    mat.feld[i] = calloc(n, sizeof(double));

  mat.m = m;
  mat.n = n;

  return mat;
}

void free_matrix(matrix mat) {
  int i;
  for(i = 0; i < mat.m; ++i)
    free(mat.feld[i]);
  free(mat.feld);
}


Und dann nachher in der Anwendung:

C++:
matrix m;
calloc_matrix(m, 3, 3); /* Speicher anfordern */
m.feld[0][1] = 2; /* m.feld[0][1] ist das zweite Feld der ersten Spalte */
free_matrix(m); /* Speicher wieder freigeben */


Das schöne daran ist, dass du auf sehr einfache Weise Zeilen in der Gegend hin- und herschieben kannst, und dass die Indizierung sehr gut lesbar ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
035
04.01.2004, 21:57 Uhr
Lumina



Wow, Leute,
ich muss sagen, ihr setzt euch ganz schön für ein Mädel wie mich ein!

@ Windalf:
Also in Mathe bin ich top drauf, hatte Mathe LK und an der FH hab ich bis jetzt auch keinerlei Probleme in Mathe, macht sogar richtig Spaß. Nur an der Umsetzung in die Programmiersprache scheiterts momentan anscheinend.

hab noch ne Frage an dich! (sorry, schon wieder ein mal)
Wie bekomme ich die Warnung

Code:
warning C4013: 'memcpy' undefiniert; Annahme: extern mit Rueckgabetyp int



aus diesem Code von dir, den ich versucht habe, umzuwandeln:

C++:
#include <stdio.h>
#include <malloc.h>
//#include <atlbase.h>


void matrix_inv(double *m, int n)
{
    int i, j, k;
    double    h;
    double *mat;
    
    mat = (double*)malloc (n*n*sizeof(double));
    
    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));
    free(mat);
}

void main()
{

    int i, j, n = 3;

    double *matrix;
    matrix = (double*)malloc (n*n*sizeof(double));

    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");
        }

    free(matrix);
}



Mathematisch ist scheinbar alles korrekt, kann ihn zu 98 % nachvollziehen.
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
036
04.01.2004, 21:59 Uhr
Lumina



@ 0xdeadbeef:
Wenn ich es so kompliziert mache, dann erkennt man, dass es nicht mein Werk ist.. .
Aber danke für deinen Hinweis!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
037
04.01.2004, 22:04 Uhr
Lumina



@ Windalf:

Noch was am Rande: ich habe absolut nichts gegen BWLer, denn als ich mal auf Exkursion in der Uni Rgbg war und meine Freundin und ich vom Gymmi aus eine Umfrage machen mussten, waren die BWLer die nettesten und hübschesten Jungs. Und intelligent bist du ja sowieso, das merkt ja ein Blinder mit Krückstock.

Die letzte Aussage gilt natürlich auch für alle meine anderen fleißigen und zuverlässigen Helfer! Dankeschön!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
038
04.01.2004, 22:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


probier mal..

C++:
#include <memory.h>



so wie beefy das vorschlägt ist das nicht kompliziert sondern einfacher....

du musst das ja eh so machen wie er das geschrieben hat nur das du die schritte nicht so wie er in funktionen kapseln willst sondern einzeln den speicher allokierst was dann fast immer unweigerlich zu Fehlern führt... Machs lieber so wie er vorgeschlagen hat

Ach so falls dich das mit dem calloc nervt....
das ist das gleiche wie malloc nur das der alle elemente im array per default mit 0 initialisiert... kannst also genausogut malloc verwenden....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 04.01.2004 um 22:10 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
039
04.01.2004, 22:11 Uhr
Pablo
Supertux
(Operator)



Zitat:
Lumina postete
Mathematisch ist scheinbar alles korrekt, kann ihn zu 98 % nachvollziehen.


ja, mathematisch sieht das nicht schlecht aus. Nur 98%? und was sind die restilichen 2%
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 < [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ] [ 17 ] [ 18 ] [ 19 ] [ 20 ]     [ C / C++ (ANSI-Standard) ]  


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: