Ich schrieb einen abgeleiteten Datentyp zum Speichern von banded Matrizen im komprimierten diagonalen Speicherformat; Insbesondere speichere ich jede Diagonale der Bandmatrix in einer Spalte der 2D-Arrays cds(1:N,-L:U)
, wo N
die Anzahl der Zeilen des Vollmatrix und L
und U
ist die Anzahl der unteren und oberer Diagonalen (this question umfasst die Definition von der Typ).Speicherung von banded Matrix in Fortran
Ich schrieb auch eine Funktion, um das Produkt zwischen einer Matrix in diesem CDS-Format und einem vollständigen Vektor durchzuführen. Um jedes Element des Produktvektors zu erhalten, werden die Elemente der entsprechenden Reihe von cds
verwendet, die im Speicher nicht zusammenhängend sind, da die Sprache Fortran ist. Aus diesem Grund wanderte ich, wenn eine bessere Lösung wäre, die Diagonalen in der Reihe eines cds2(-L:U,1:N)
Reihen zu speichern, die mir ziemlich vernünftig scheint.
Im Gegenteil here las ich
wir für die Matrix
A
ein Arrayval(1:n,-p:q)
zuordnen kann. Die Deklaration mit umgekehrten Dimensionen(-p:q,n)
entspricht dem LINPACK-Bandformat [132], das im Gegensatz zu komprimiertem Diagonalspeicher (CDS) keine effizient vektorisierbare Matrix-Vektor-Multiplikation zulässt, wennp + q
klein ist.
Was meiner Meinung nach gerade C angemessen erscheint. Was vermisse ich?
EDIT
Der Kern der Routine Performing Matrixvektorprodukte ist die folgende
DO i = A%lb(1), A%ub(1)
CDS_mat_x_full_vec(i) = DOT_PRODUCT(A%matrix(i,max(-lband,lv-i):min(uband,uv-i)), &
& v(max(i-lband,lv):min(i+uband,uv)))
END DO
(Wo lv
und uv
verwendet werden berücksichtigt den Fall des Vektors aus einem Index indiziert anders als 1.) Auf die Matrix A wird dann durch Zeilen zugegriffen.
Das wird ziemlich davon abhängen, wie die Matrix-Multiplikation auf Zeilen und Spalten zugreift. –
Ja, aus Ihrem Beispiel scheint die andere Reihenfolge schneller zu sein. Sie können versuchen und messen. Vielleicht berechnet die andere Bibliothek es anders? –