2017-12-20 3 views
0

Ich versuche, diesen Code zu verstehen, aber ich kann nicht: Die n x n Matrix wird spaltenweise gespeichert. Ich unterscheide zwischen voller (F), oberer (U) und unterer (L) Matrix. n die Dimension der MatrixMatrix spaltenweise speichern in C++

int sum(int k){ 
int s = 0; 
for (int i = 1; i<=k; i++) 
    s += i; 
return s;} 


double getentry(int j, int k){ 
    j--;k--; 

    assert(typ == 'F' || typ == 'U' || typ == 'L'); 
    assert(k<n && j<n); 

    if(typ == 'F') return mat[k*n+j]; 
    if(typ == 'L') return (k>j)?(0.0):(mat[k*n+j-sum(k)]); 
    if(typ == 'U') return (j>k)?(0.0):(mat[k*n+j-sum(n-1)+sum(n-(k+1))]); 
} 

ich ausdrücklich nicht verstehen, diese Zeilen:

if(typ == 'L') return (k>j)?(0.0):(mat[k*n+j-sum(k)]); 
    if(typ == 'U') return (j>k)?(0.0):(mat[k*n+j-sum(n-1)+sum(n-(k+1))]); 

Aber ich würde es begrüßen, wenn Sie auch diese Zeile erklären könnte:

if(typ == 'F') return mat[k*n+j]; 
+0

zu berechnen, * Ich verstehe diese Zeilen nicht: * - Zu breit. Was verstehst du nicht? Die Syntax? Die Formel? Die 'Rückkehr'-Aussage? Der "ternäre Operator"? – PaulMcKenzie

+1

Nimm ein Blatt Papier, zeichne eine U-, L- und eine F-Matrix und zähle die Elemente von 1 bis N auf, dann kannst du verstehen, was dieser Code macht – user463035818

+0

Ich verstehe die Formel nicht (die Begriffe zwischen [...]) – alex403

Antwort

2

Die Linien

if(typ == 'L') return (k>j)?(0.0):(mat[k*n+j-sum(k)]); 
     if(typ == 'U') return (j>k)?(0.0):(mat[k*n+j-sum(n-1)+sum(n-(k+1))]); 

signieren Sie die Verwendung der , um Ihre Matrix zu speichern.

Beachten Sie auch, dass IMHO die Gesamtcodequalität ist recht gering, zum Beispiel keine Notwendigkeit, mit einem sum(k)for-Schleife, dessen explizite Ausdruck (k + 1) * k/2 usw.

Verwandte Themen