Problem mit Code zur LR-Zerlegung



  • Hallo,

    ich möchte die LR-Zerlegung in C programmieren. Als Compiler benutze ich Xcode und das Programm wird auch fehlerfrei compiliert.
    Allerdings kommt ber der Ausführung dann der Fehler "Segmentation fault".
    Ich habe nicht so viel Erfahrung mit dem Programmieren und habe mir einfach mal den Pseudo-Code zur LR Zerlegung bei Wikipedia angeguckt und den dann ein bisschen umgeändert. Die Definitionen von Vektoren und Matritzen hat mir mein Prof mal so definiert.
    Mein Code sieht folgendermaßen aus:

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    typedef double *PVector;
    typedef double **PMatrix;
    
    PVector TVector_Create(int n){
    	return (PVector) calloc(n, sizeof(double));
    }
    
    PMatrix TMatrix_Create(int m, int n){
    	PMatrix  A;
    	int i;
    	A = (PMatrix) malloc(m * sizeof(PVector));
    	for ( i=0; i<m; i=i+1 )
    		A[i] = TVector_Create(n);
    	return A;
    }
    
    PVector readVector(int n) {
    	int i;
    
    	PVector v = TVector_Create(n);
    
    	for(i = 0; i < n; i++){
    		printf("Geben Sie v %d ein\n", i+1);
    		scanf("%lf", &v[i]);
    		fflush(stdin);
    	}
    	return v;
    }
    
    PMatrix readMatrix(int m, int n) {
    	int i,j;
    
    	PMatrix A = TMatrix_Create(m, n);
    
    	for(i = 0; i < m; i++) {
    		for(j = 0; j < n; j++){
    			printf("Geben Sie A %d %d ein\n", i+1, j+1);
    			scanf("%lf", &A[i][j]);
    			fflush(stdin);
    		}
    	}
    	return A;
    }
    
    void writeVector(PVector v, int n) {
    	int i;
    
    	printf("(");
    	for(i = 0; i < n; i++) {
    		printf("%f,", v[i]);
    	}
    	printf(")\n");
    
    }
    
    void writeMatrix(PMatrix A,int m, int n) {
    	int i, j;
    
    	printf("(");
    	for(i = 0; i < n; i++) {
    		for(j = 0; j < m; j++) {
    		printf("%f,", A[i][j]);
    		}
    	}
    	printf(")\n");
    
    }
    
    int main(void){
    	int n, m, i, k, j;
    	//double i, k, j;
    	PMatrix A;
    	//PVector xalt, xneu, temp;
    
    //Eingabe der Dimension
    	printf("Geben Sie n an\n");
    	scanf("%d",&n);
    	fflush(stdin);
    	printf("Geben Sie m an\n");
    	scanf("%d",&m);
    	fflush(stdin);
    
    //Eingabe: Matrix A
    	A = readMatrix(n, m);
    
    //LR Zerlegung
    
    	for(i = 1; i < n; i++) {
    	// Bestimmen von R
    		for(j = i; j < n; i++) {
    			for(k = 1; k< i-1; k++){               
    				A[i][j]-= A[i][k] * A[k][j]; 
    			}
    		}
    	// Bestimmen von L
    		for(j = i+1; j<n; j++){
    			for (k = 1; k < i-1; k++){
    				A[j][i] -= A[j][k] * A[k][i];
    			}
    			A[j][i] /= A[i][i];
    		}
    	}
    
    	return 0;
    }
    

    Kann mir jemand sagen, warum der nicht durchläuft? Eigentlich soll das Programm ja nurdie Matrix A mit der LR Zerlegung überschreiben und sonst nichts...

    Schon mal Danke im Voraus und viele Grüße!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    1. Arrays gehen bei 0 los
    2. In Zeile 94 sind gleich mehrere Fehler. Guck mal scharf hin.
    3. fflush(stdin) löst undefiniertes Verhalten aus, außer auf einem gewissen Compiler von Microsoft.



  • Ok, danke.

    Zeile 94 hab ich geändert in
    ...
    for(j = i; j < m; j++)
    ...

    Jetzt läuft das Programm auch durch.
    Ich hab zum Schluss einfach mal die Matrix ausgeben lassen.
    Das Programm gibt dann aber wieder die gleiche Matrix aus wie ich eingegeben habe. Kann das stimmen?


  • Mod

    Es hatte bestimmt einen Grund, warum ich den Punkt 1. erwähnt habe...



  • Ja, die 1sen habe ich auch in 0en geändert.
    Die main(void) Funktion sieht jetzt so aus:

    int main(void){
    	int n, m, i, k, j;
    	//double i, k, j;
    	PMatrix A;
    	//PVector xalt, xneu, temp;
    
    //Eingabe der Dimension
    	printf("Geben Sie n an\n");
    	scanf("%d",&n);
    	fflush(stdin);
    	printf("Geben Sie m an\n");
    	scanf("%d",&m);
    	fflush(stdin);
    
    //Eingabe: Matrix A
    	A = readMatrix(n, m);
    
    //LR Zerlegung
    
    	for(i = 0; i < n; i++) {
    	// Bestimmen von R
    		for(j = i; j < m; j++) {
    			for(k = 0; k< i-1; k++){               
    				A[i][j]-= A[i][k] * A[k][j]; 
    			}
    		}
    	// Bestimmen von L
    		for(j = i+1; j<m; j++){
    			for (k = 0; k < i-1; k++){
    				A[j][i] -= A[j][k] * A[k][i];
    			}
    			A[j][i] /= A[i][i];
    		}
    	}
    
    	writeMatrix(A, m, n);
    	return 0;
    }
    

    Ich hab jetzt auch festgestellt, dass das PRogramm doch rechnet, aber irgendwie ändert es nur die letzte Zahl.



  • Das gibt ja Augenkrebs.

    Nutze doch bitte die Code oder besser die cpp Tags.

    Code markieren und dann den C/C++ Button unter den 🙂 😃 😉 drücken.

    Die sind unter dem Eingabefeld für den Nachrichtentext zu finden.

    Als Registrierter darfst du auch editieren.


Anmelden zum Antworten