Matrix-Rechnung
-
Hallo
Ich habe Probleme mit dem Programm:
#include <stdio.h> #include <stdlib.h> #include <math.h> double frobnorm(double **A, unsigned int m, unsigned int n){ double ergebnis, buf; int i,j=0; while (j<n) { for (i=0; i < m; i++) { buf = (A[i][j])*(A[i][j]); ergebnis += buf; } j++; } ergebnis = sqrt(ergebnis); return ergebnis; } int main () { int m =3, n=3; double a[3][3] = {{1,2,1},{-1,2-3},{0,1,-2}}; printf("Norm: %f",frobnorm(a, m, n)); return 0; }
Das Programm soll mir die Frobeniusform ausrechnen, also die Wurzel aus den summierten Quadraten aller Ziffern der Matrix.
Eigentlich müsste der Code vom Prinzip her stimmen, aber ich glaube weil ich **A in der Funktion habe, muss ich die Rechnung anders schreiben.Wäre sehr dankbar für etwas Hilfe
-
Ein 2D-Array wie dein
double a[3][3]
zerfällt nicht in einen Doppelpointer.
Das bleibt ein einfacher Zeiger.
-
DirkB schrieb:
Ein 2D-Array wie dein
double a[3][3]
zerfällt nicht in einen Doppelpointer.
Das bleibt ein einfacher Zeiger.Die Funktion
double frobnorm(double **A, unsigned int m, unsigned int n)
muss so bleiben.
Was muss ich ändern?
-
Du brauchst ein Array von double*
int main () { int m =3, n=3; double a[3][3] = { {1,2,1}, {-1,2-3}, {0,1,-2} }; double *c[] = { a[0], a[1], a[2]}; // gibt Warnungen //oder double *b[3] ; b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; printf("Norm: %f\n",frobnorm(b, m, n)); printf("Norm: %f\n",frobnorm(c, m, n)); return 0; }
Wichtig wäre auch die Initialisierung von
ergebnis
mit einem sinnvollen Wert.
-
Danke DirkB.
DirkB schrieb:
Du brauchst ein Array von double*
int main () { int m =3, n=3; double a[3][3] = { {1,2,1}, {-1,2-3}, {0,1,-2} }; double *c[] = { a[0], a[1], a[2]}; // gibt Warnungen //oder double *b[3] ; b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; printf("Norm: %f\n",frobnorm(b, m, n)); printf("Norm: %f\n",frobnorm(c, m, n)); return 0; }
Jetzt kommt zumindest ein Ergebnis raus, aber leider noch nicht ganz richtig. Muss an der Funktion noch etwas verändert werden?
DirkB schrieb:
Wichtig wäre auch die Initialisierung von
ergebnis
mit einem sinnvollen Wert.Was genau meinst du damit?
-
Bei der Initialisierung bekommt eine Variable erstmals einen Wert.
Vorher kann sie einen beliebigen haben.
Wenn du also mit einer Variablen rechnest, sollte sie einen sinnvollen Wert enthalten.Die Initialisierung kannst du bei der Definition (m,n,j) oder später (buf, i) machen.
Nur bei
ergebnis
machst du das nicht.
Bedenke dasergebnis += buf;
die Kurzschreibweise fürergebnis = ergebnis + buf;
ist.
Und da stehtergebnis
auch auf der rechten Seite.
-
Danke! Ich hab den Fehler