================================== Matrix initialisieren und ausgeben [TOC] ================================== In einem ersten Beispiel sollt ihr ein Programm schreiben, das eine $6\times 8$ Matrix $A$ initialisiert und dann $A$, $A^T$ und $\text{diag}(A)$ (den Vektor der Diagonalelemente) ausgibt. Bei der Initialisierung sollen die Elemente zeilenweise durchnummiert werden mit $1,2, \dots$. Die Matrix $A$ soll im Full-Storage-Format spaltenweise gespeichert werden. Eine Aufgabenstellung in Pseudo-Code könnte so aussehen: ---- CODE(type=txt) -------------------------------------------- program initmatrix procedure initGeMatrix(A) input: m x n general matrix A result: matrix A is overwritten as specified begin for i=1,..,m for j=1,..n A(i,j) = (i-1)*n + j end end end procedure printGeMatrix(A) input: m x n general matrix A result: matrix A printed to stdout begin for i=1,..,m for j=1,..n print A(i,j) end print newline end print newline end data: buffer for 6 x 8 general Matrix A begin initGeMatrix(A) print "A = " printGeMatrix(A) print "A^T = " printGeMatrix(A^T) print "diag(A) = " printGeMatrix(diag(A)) end ---------------------------------------------------------------- Beachtet, dass im Pseudo-Code der Puffer für die $6 \times 8$ Matrix $A$ zwar global definiert wird, dass aber die Prozeduren die Matrix als Parameter erhalten und somit nicht fest mit der globalen Matrix verdrahtet sind. Die Implementierung soll maximal einfach sein und noch keine Macros oder Include-Direktiven verwenden. Damit erhalten wir folgendes Grundgerüst, bei dem nur noch die kommentierten Stellen mit eigenem Code zu ersetzen sind: ---- CODE(type=c) ---------------------------------------------- int printf(const char *, ...); void initGeMatrix(int m, int n, double *A, int incRowA, int incColA) { // ... } void printGeMatrix(int m, int n, const double *A, int incRowA, int incColA) { // ... } double A[6*8]; int main() { // initGeMatrix( ... ); printf("A =\n"); // printGeMatrix( ... ); printf("A^T =\n"); // printGeMatrix( ... ); printf("diag(A) =\n"); // printGeMatrix( ... ); return 0; } ---------------------------------------------------------------- Bei der Ausgabe eines Matrixelementes sollen vier Nachkommastellen ausgegeben werden. Verwendet zum Beispiel im Fomatstring `%10.4lf` als Platzhalter für einen double-Wert. :navigate: up -> doc:index next -> doc:session04/page02