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 ]
040
04.01.2004, 22:19 Uhr
Lumina




Zitat:
Pablo postete
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



Soweit stimmt es ja, aber falls du den Herrn Papula Lothar kennst oder vielmehr seine Bücher, dann schau mal im Band 2 auf Seite 279 oder so...

Zu jeder regulären n-reihigen Matrix A gibt es genau eine inverse Matrix A°-1 mit

A°-1 = (1 / det(A)) * ....hier kommt eine aus dem Algebraischem Komplement zusammengesetzte Matrix als zweiter Faktor!

Algebraisches Komplement von a(i,k) ind det(A):
A(i,k) = (-1) °(i+k) * D(i,k)
und
D(i,k): (n-1)-reihige Unterdeterminante von det(A), d.h. in der Determinante det(A) wird die i-te Zeile und die j-te Spalte gestrichen.
--
*******************************************
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
041
04.01.2004, 22:35 Uhr
Pablo
Supertux
(Operator)


Nein, den Herrn Papula Lothar kenne ich nicht. Ich kenne den Herrn Beutelspacher (wenn ich mich nicht irre, Uni Giessen). Der Typ ist super, erklärt echt gut und ganz einfach. Seine Lineare Algebra Bücher sind gutes Komplement für die Vorlesung.

Ja, normalerweise betrachtet man die regulären Matrizen als die invertierbaren Matrizen. Ich glaube es ist eine gdw. Beziehung, also regulär <==> invertierbar. Was ich nachschauen muss, ist wie verhält sich die Determinante einer Matrix. Ich glaube, man kann daüber nicht so viel folgern, außer wemm det(A) = 0 ==> A nicht regulär, also nicht invertierbar.

Als Algebraisches Komplement sagt mir der Name gar nix. Oder ich kann mich nicht daran erinnern, aber das (was du gepostet hast) ist das Schema des Entwicklungsalgorithmus für die Berechnung der Determinante, und den kannte ich schon. Der ist sehr hilfreich, vor allem, wenn die Matrix viele 0 Einträge hat, da verschwinden viele Matrizen und die Sache vereinfacht sich. In der Klausur habe ich nur diesen Algorithmus angewandt, ich fand ihn einfacher und schneller, und um ehrlich zu sein, würde ich nie im Leben Leibniz anwenden, außer für 3x3 Matizen


Bearbeitung von Pablo:

Ja, die Determinante (Entwicklung nach der i-Zeile) wäre auch (mit diesem Alg. Komplement)

Code:
(LaTeX Code, \cdot = *)
\sum_{j=0}^{n}A(i,j) \cdot a_{ij}




--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 04.01.2004 um 22:40 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
042
05.01.2004, 09:03 Uhr
Lumina



Der Papula Lothar hat eine Reihe von Büchern herausgegeben und da steht das obige eben auch unter dem Stichwort "inverse Matrix" bzw. "Invertierung einer Matrix"

Aber das ist ja jetzt egal...

Da steht noch eine andere Frage im Raum, nämlich die mit dem "memcpy" (s.o.)
Wie lautet hierfür der Befehl in C?
--
*******************************************
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
043
05.01.2004, 10:58 Uhr
Pablo
Supertux
(Operator)


Laut den man-Pages:

Zitat:

#include <string.h>

void *memcpy(void *dest, const void *src, size_t n);



Laut meinem Linux · Unixsystemprogrammieren (Kap 2: die ANSI-C-Bibliotek) befindet sich memcpy auch in string.h
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
044
05.01.2004, 11:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenn dir der memcpy nicht gefällt ersetze ihn halt durch ne schleife
das kommt mehr oder weniger aufs selbe

C++:
   for(j=0; j<n*n;++j)m[j]=mat[j];


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

Dieser Post wurde am 05.01.2004 um 11:29 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
045
05.01.2004, 11:34 Uhr
Lumina



also die Warnung ist ja jetzt weg, aber ich krieg immer noch Mist raus, nämlich:

ultra große negative Zahlen!

was könnte das jetzt wieder sein?
--
*******************************************
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
046
05.01.2004, 11:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


poste mal den komplette quellcode und die matrix mit der du rechnest und was rauskommen soll. So kann ich nichts dazu sagen.....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
047
05.01.2004, 11:46 Uhr
Pablo
Supertux
(Operator)


Wenn du Mist bekommst, könnte es sein, dass du mit nicht initialisierten Pointers arbeitest oder so. Es wäre besser, wenn du den Quellcode postest, so wie Windalf sagt.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
048
05.01.2004, 11:46 Uhr
Lumina



mein main:

C++:
# include "Fkt_Sammlung.h"

const char Wahl_MatInv = '1',
           Wahl_DetBer = '2',
           Wahl_LinGlS = '3',
           WahlAbbruch = '4';
void main(void)
{
    char wahl;
    int Rang = 0;
    double mat[100] = {0};

    do
    {
    system("cls");
    printf("\n Waehlen Sie aus den folgenden Alternativen:\n"
           "        *********************************************************\n"
           "        *                                                       *\n"
           "        *  %c) Matrixinvertierung                               *\n"
           "        *  %c) Determinantenberechnung                          *\n"
           "        *  %c) Loesung eines linearen Gleichungssystems         *\n"
           "        *  %c) Abbruch                                          *\n"
           "        *                                                       *\n"
           "        *********************************************************\n\n",
    Wahl_MatInv, Wahl_DetBer, Wahl_LinGlS, WahlAbbruch);


    wahl=getch();
    printf("\n");

        switch(wahl)
        {
          case '1':  /* Matrixinvertierung */
            {
             int i, j, n = 3;
             double *matrix;

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

             printf(" \"Matrixinvertierung\" gewaehlt\n\n"
                    " Geben Sie den Rang/die Dimension der zu invertierenden Matrix an\n"
                    " (maximal 10): ");            
             scanf("%d", &Rang);
            
             EingabeDerMatrix(mat, Rang);

             /* Bedingungen fuer Invertierbarkeit:
                - Matrix ist quadratisch
                - es muss eine regulaere Matrix mit vollem Rang vorliegen */


             if (Det(mat,Rang) != 0) MatrInv(mat, Rang);
             else printf(" Diese Matrix ist nicht invertierbar, da sie nicht vollen Rang\n"
                         " hat und ihre Determinante folglich auch nicht ungleich 0 ist!");

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

             free(matrix);

             getch();
             break;
             }

          case '2':  /* Determinantenberechnung */
            {
             printf(" \"Determinantenberechnung\" gewaehlt\n\n"
                    " Geben Sie den Rang/die Dimension der Matrix an, von der die"
                    " Determinante\n berechnet werden soll: ");
             scanf("%d", &Rang);

             EingabeDerMatrix(mat, Rang);


             printf("\n Die Determinante der Matrix ist: %lf", Det(mat,Rang));
             getch();
             break;
             }

          case '3':  /* Loesung eines linearen Gleichungssystems */
            {
             printf(" \"Loesung eines linearen Gleichungssystems\" gewaehlt\n\n");
             LoesLinGS();  
             break;
             }

          case '4':  /* Keine weiteren Aktionen. */
            {
             printf(" Abbruch!\n\n");
             break;
             }
          default:
            {
             printf("Fehlerhafte Auswahl!\n");  
             }
        } /* Ende des SWITCH */
    }
    while(wahl!=WahlAbbruch); /* Ende der DO-WHILE-Schleife */
}



meine Headerdatei:

C++:
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

void EingabeDerMatrix(double mat[100], int Rang);
double Det(double *matrix, int Rang);
void MatrInv(double *m, int Rang);

void LoesLinGS();



meine Funktionendatei:

C++:
  /*  STUDIENARBEIT TEIL 2 IN SOFTWARE-SYSTEMTECHNIK, WS 2003/2004 */
  /*  Autor:    Sonja Birner        */
  /*  Mat.-Nr.: 025001830122  01ST1 */

# include "Fkt_Sammlung.h"

  /****************************************************************/
  /* Funktion: EingabeDerMatrix                                   */
  /* Zweck:    Eingabe einer Matrix zur späteren Bearbeitung      */
  /*                                                              */
  /****************************************************************/

void EingabeDerMatrix(double matrix[], int Rang)
{
    int Spalte, Zeile;
    int n=0;

    for (Zeile = 0; Zeile < Rang; Zeile++)
        for (Spalte = 0; Spalte < Rang; Spalte++)        
        {
            printf("%d. Zeile, %d. Spalte: ", Zeile+1, Spalte+1);
            scanf("%lf", &matrix[n]);
            n++;
        }
}

  /****************************************************************/
  /* Funktion: Det                                                */
  /* Zweck:    Berechnung der Determinante einer Matrix           */
  /*                                                              */
  /****************************************************************/

double Det(double *matrix, int Rang)
{
    double *h;
    double r = matrix[0] * matrix[3] - matrix[1] * matrix[2];
    int i, j, k, x = Rang-1, b = 1;
        if(Rang-2)
        {
            r = 0;
            for(i = -1; ++i<Rang; b = -b)
            {
                h = (double*)malloc(x*x*sizeof(double));
                for(j = 0; j<x; j++)
                    for(k=0;k<x;k++)
                        h[k+j * Rang-j] = matrix[(k<i?0:1) + Rang + k + j*Rang];
                r+= b * matrix[i] * Det(h,x);
                free(h);
            }
        }
    return r;
}

/****************************************************************/
  /* Funktion: MatrInv                                            */
  /* Zweck:    Bildung der Inversen einer Matrix                  */
  /*                                                              */
  /****************************************************************/

void MatrInv(double *m, int Rang)
{        
    int i, j, k;
    double    h;
    double *mat;
    
    mat = (double*)malloc (Rang*Rang*sizeof(double));
    
    for(j = 0; j<Rang; j++)
        for(i = 0; i<Rang; i++) mat[i+j*Rang] = i != j ? 0:1;

    for(j = 0; j<Rang; j++)
    {
        h = m[j*Rang+j];

        for(k = 0; k<Rang; k++)
        {
            m[k+j*Rang] /= h;
            mat[k+j*Rang] /= h;
        }

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

}

/****************************************************************/
  /* Funktion: LoesLinGS                                          */
  /* Zweck:    Loesung eines linearen Gleichungssystems           */
  /*                                                              */
  /****************************************************************/

void LoesLinGS()
{
    printf(" Lineares Gleichungssystem loesen!");
    getch();
}



getestet habe ich mit genau den Werten, die du in deinem Rätsel verwendet hast...
--
*******************************************
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
049
05.01.2004, 11:49 Uhr
Lumina



das meiste von dem Code dürfte dir bekannt sein, Windalf

Hoffentlich könnt ihr mir auch diesmal aus der Patsche helfen...
--
*******************************************
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
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: