Programm mit Vektorrechenoperationen



  • Hallo,
    bei folgender Programmieraufgabe brauche ich dringend Hilfe..

    Gefragt ist ein Programm, welches ein mehrdimensionales double array V[m][n] einliest und erzeugt. Dieses soll eine Matrix bzw. Speicher für m Zeilenvektoren sein.

    Nun soll mit dem m Zeilenvektoren das Gram-Schmidt-Orthonormalisierungsverfahren durchgeführt werden, d.h.

    1. V[i] := V[i]-[∑ j=0 bis i-1(<V[j],V[i]>*V[j])]
    2. V[i] := 1/(||V[i]||)*V[i]

    mit folgenden Funktionen:

    vec_plus: Vektoraddition x=x[m]+a*y[n]

    vec_mult: Vektormultiplikation x=a*x[m]

    dotprod: Skalarprodukt <x,y>=∑(x[i]*y[i])

    norm2: Norm ||x||=sqrt(<x,x>)

    Ausgegeben werden soll das berechnete Orthonormalsystem in Matrixform.

    Bisher habe ich die vier Funktionens als Makros im Präprozessor(Vorgabe!) definiert:

    [code=
    #define vec_plus(x,y,a,m,n,i) for(i=0;i<m;i++){x[i]
    #define vec_plus(x,y,a,m,n,i) for(i=0;i<m;i++){x[i]=x[i]+ay[i];}
    #define vec_mult(x,a,n,i) for(i=0,i<n,i++){x[i]+=a
    x[i];}
    #define dotprod(x,y,n,i) for(i=0,i<m,i++){x[i]+=x[i]*y[i];}
    #define norm2(x) fabs(x)
    [/code]

    Die Werte für die Zeilenvektoren habe ich auch schon mittels einer for-Schleife und printf/scanf eingelesen.

    Nun weiß ich allerdings nicht, wie ich weitermachen soll...

    Wäre für jede Hilfe dankbar!!



  • Da ist dir nicht mehr zu helfen.
    Wer solche Makros einsetzt, schlägt auch kleine Kinder.



  • Super, danke. Besonders hilfreiche Antwort.

    Wie ich schon geschrieben hatte ist es Teil der Aufgabe, die Funktionen als Makros zu schreiben. Darauf habe ich keinen Einfluss.

    Wie wärs mit konstruktiver Kritik und Verbesserungsvorschlägen?


  • Mod

    plusminus schrieb:

    Wie ich schon geschrieben hatte ist es Teil der Aufgabe, die Funktionen als Makros zu schreiben. Darauf habe ich keinen Einfluss.

    Aufgabenstellung? Das wäre unvorstellbar dämlich das so zu machen, da würde ich mich weigern.

    Wie wärs mit konstruktiver Kritik und Verbesserungsvorschlägen?

    Zunächst mal machst du alles falsch, was man bei solchen Makros so falsch machen kann (abgesehen von den Dingen, die an solchen Makros sowieso falsch sind und die man prinzipbedingt nicht verhindern kann, wenn man sie benutzt. Siehe oben.). Guck dir also mal die üblichen Fallstricke an und verbessere die vorhandenen Funktionen.



  • Poste mal die Aufgabenstellung im Wortlaut. Man kann ja nur hoffen, dass du das irgendwie falsch interpretiert hast.



  • Das ist die Aufgabe:

    1. a) Suppose that two vectors x,y ∈Rn, n ∈N, are given by two double-arrays x and y of length n. Furthermore, suppose that α ∈R is given by some double-variable a.

    Write four functions vec_plus, vec_mult, dotprod, norm2 that serve the following purposes:
    i) vec_plus computes the vector sum x + αy ∈Rn and stores it in x.
    ii) vec_mult computes αx ∈Rn and stores it in x.
    iii) dotprod computes the dot product (scalar product) <x,y> = sqrt(∑i=1 xiyi.
    vi) norm2 computes the Euclidean norm ||x||2 := ∑i=1 xi^2 = <x,x>.
    Before you start with programming, clarify which signatures the functions should have.

    b) Write a main-program, that reads non-negative integers m, n with m ≤ n from the keyboard, generates a two-dimensional double-array V[m][n], and reads its entries from the keyboard. The array V is interpreted as a set of m row vectors V0,...,Vm ∈Rn. Use the functions from a) to implement the Gram-Schmidt-orthonormalization algorithm for these vectors:

    for i = 0,1,...,m−1 do

    Step 1: Vi := Vi−∑<Vj,Vi>Vj ,
    Step 2: Vi :=(1/||Vi||2)*Vi.

    Finally, print the obtained orthonormal system. For testing the correctness of your result compute and display also the entries of the (m×m)-matrix VV^T. What should be the result? Recall that the (i,j)-entry of VV^T is <Vi,Vj> for i,j ∈{1,...,n}.

    Also...?



  • In der Aufgabenstellung steht nichts von Makros.



  • Ok, ich nehme alles zurück und werde es ohne Makros machen. War wohl ein Missverständnis zwischen meinen Kollegen und mir.

    Jetzt habe ich aber doch noch eine Frage:

    Ich habe ja ein zweidimensionales Array V[m][n] eingelesen. Wie kann ich nun die Spaltenwerte als Spaltenvektoren für die Rechenoperationen verwenden?
    Einfacher wäre es ja, einzelne Vektoren zu benutzen, aber das entspricht ja leider nicht der Aufgabenstellung.



  • Du sollst das Gram-Schmidt-Verfahren doch nur mit den Zeilenvektoren durchführen.


Log in to reply