Zitat von
alpha civ
Ich verwende doch Vektoren von Vektoren? Ansonsten wüsste ich hier nicht, wie ich was auflösen sollte.
Selbst wenn die Vektoren im Speicher verstreut werden, müsste doch der Abstand zwischen aufeinander folgende Matrixelemente in beide Richtungen konstant sein!?
D.h. in Pointerschreibweise kann man sich so ohne Multiplikationen und ohne Indexvariablen durchhangeln (Pseudocode)
Code:
double *pMu_ij = &Mu[i,0];
const double d = &Mu[i,1]-&Mu[i,0]; //bin mir gerade unsicher, ob das hier 1 ist....
const double pMu_ijEnd = &Mu[i,i];
while( pMu_ij < pMu_ijEnd ){
[...]
pMu_ij += d
}
Davon kann ich nicht ausgehen. Die Mu-Matrix kann sowohl positiv als auch negative Einträge haben. Ich weis nur, dass die Einträge betragsmäßig kleiner oder gleich 0.5 ist, außer auf der Hauptdiagonalen, die besteht nur aus Nuller. Mu ist eine untere Dreiecksmatrix (und stammt aus der Gram-Schmidt-Orthogonalisierung).
Dann sind ja eigentlich nur die Werte -0.5 und 0.5 (plus Rundungsfehler weg von Null) relevant. D.h. der Aufruf der Rundungsfunktion kann durch eine Bitmaske ersetzt werden, welche den Exponenten überprüft. Der Exponent muss ja 2^-1 sein, damit zu +1 oder -1 gerundet wird. Leider nervt dann noch das Vorzeichen.
Ist aber mehr akademischer Natur, denn eigentlich müssten heutige CPUs fürs Runden einen eigenen Maschinenbefehl haben, der schneller ist. Da kostet das Switch dann mehr als man spart (ungetestet)
Bei der Verarbeitung von d fällt noch auf, dass du die zwei Fälle d=1 und d=-1 in zwei If-Zweigen abhandeln könntest. So sind sogar alle Multiplikationen komplett eliminierbar. (Was kein Optimierer hinbekommt, da die Werte für d zur Kompilezeit nicht bekannt sind.)
Edit: Der Verweis auf BLAS ist nat. besser und sicher nützlicher als mein Zeug Dreiecksmatrix ist auch gut.
Irgendwo kommt mir der Codeschnipsel in seiner Struktur auch bekannt vor. Kann sein dass es da wirklich schon einen handoptimierten Code gibt. Dann besteht aber immer noch die Schwierigkeit die Eingabedaten in die passende Form für diese Blas-Methode zu bekommen.