Matrix Invertierung
-
Hi,
ich bin total frustiert. Ich versuche diesen ver"...." Code für eine Matrix-Invertierung zu stabilisieren, aber das Programm stürtzt ständig ab.
Vielleicht kann mir jemand sagen, was zu machen ist bzw. eine Alternative nennen.
Vielen Dank.
int INV(double *A, double *Ainv, int dim) { int RetVal = 0; int ij, i, j, n, m, k; double temp; double *op_matrix = (double*) malloc(sizeof(double)*2*dim*dim); // Zurücksetzen des ZielVectors Ainv for (i=0; i<dim;i++) { for (j=0; j<dim; j++) { ij = i*dim + j; Ainv[ij] = 0; } } // Einheitsmatrix erzeugen // a11 a12 a13 || 1 0 0 // a21 a22 a23 || 0 1 0 // a31 a32 a33 || 0 0 1 for (i=0; i<dim; i++) { for (j=0; j<dim; j++) { ij = 2*dim*i + j; op_matrix[ij] = A[i*dim+j]; } for (j=0; j<dim; j++) { ij = (1+2*i)*dim + j; if (i == j) { op_matrix[ij] = 1; } else { op_matrix[ij] = 0; } } } for (k=0;k<dim; k++) { if ((op_matrix[k*(2*dim+1)] == 0) && (k < dim-1)) { // Suche nächste Zeile, die kein Null-Element enthält n=k; printf("n:%d\n", n); do { n++; } while (op_matrix[n*(2*dim)+k] == 0); // Austauschen der Zeilen k und n vornehmen for (m=k; m<2*dim-k; m++) { temp = op_matrix[k*(2*dim)+m]; op_matrix[k*(2*dim)+m] = op_matrix[n*(2*dim)+m]; printf("%d -- %d\n", m, n*(2*dim)+m); op_matrix[n*(2*dim)+m] = temp; } printf("----\n"); } // Zeile mit dem jeweiligen Diagonalelement normieren temp = op_matrix[k*(2*dim)+k]; if (temp != 0) { for (n=k; n<2*dim; n++) { op_matrix[k*(2*dim)+n] = op_matrix[k*(2*dim)+n] / temp; } } // Null-Element erzeugen for (n=0;n<dim;n++) { if ((n == k) && (n < 2*dim)) { n = n + 1; } if (op_matrix[n*(2*dim)+k] != 0) { temp = op_matrix[n*(2*dim)+n] / op_matrix[k*(2*dim)+k]; for (m=k;m<2*dim;m++) { op_matrix[n*(2*dim)+m] = op_matrix[n*(2*dim)+m] - op_matrix[k*(2*dim)+m]*temp; } } else { break; } } } if (RetVal == 0) { for (i=0;i<dim;i++) { for (j=0;j<dim;j++) { ij = i*dim + j; Ainv[ij] = op_matrix[(i*2+1)*dim+j]; } } } free(op_matrix); return RetVal; } #include <stdio.h> #include <math.h> #include <stdlib.h> void main(void) { const int dim = 3; int i; int RetVal; double Res; double *matrixVec = (double*) malloc(sizeof(double)*dim*dim); double *matrixVecInv = (double*) malloc(sizeof(double)*dim*dim); // Schreibe die einzelnen Elemente in das Datenfeld matrixVec matrixVec[0] = 0; matrixVec[1] = 0; matrixVec[2] = 0; matrixVec[3] = 1; matrixVec[4] = 2; matrixVec[5] = 3; matrixVec[6] = 4; matrixVec[7] = 5; matrixVec[8] = 6; printf("\n> Invertierung von A:\n-------------------------\n"); RetVal = INV(matrixVec, matrixVecInv, dim); if (RetVal == 0) { for (i=0; i<dim*dim; i++) { printf("%.2lf\t", matrixVecInv[i]); if ((i+1)%dim == 0) { printf("\n"); } } } else { printf("> ERROR: Die Matrix ist nicht invertierbar...\n\n"); } free(matrixVec); free(matrixVecInv); }
-
probier mal structs, koennte manches uebersichtlicher machen.
-
Wozu?
Ich sehe den Sinn nicht. Außerdem sollte es auch so funktionieren.
-