Welche Konvention für Dreiecksmatrizen fidnet ihr natürlicher?



  • Hi,

    das ist, glaube ich, eine recht spezielle Frage. Das Grundproblem ist folgendes:
    nehmt an, ihr würdet eine Funktion schreiben, die auf Dreiecksmatrizen arbeitet. Zum Beispiel einen Gleichungssystemlöser für Gleichungen der Form:

    Ax=b

    wobei A entweder eine obere oder untere Dreiecksmatrix ist und A auch transponiert werden darf. Das Transponieren einer oberen Dreiecksmatrix hat leider zur Folge, das aus ihr eine untere Dreiecksmatrix wird (und umgekehrt). Dadurch ergibt sich nun ein Konventionsproblem:

    A=untere Dreiecksmatrix
    solve(A,x,lower);//okay, A ist untere Dreiecksmatrix
    //A ist ganz klar immer noch eine untere Dreiecksmatrix
    solve(A.transpose(),x,lower);
    //andererseits ist das Ergebnis des transpose aufrufs eine obere...
    solve(A.transpose(),x,upper);
    

    Das Problem ergibt sich gerade dadurch, dass ich versuche zwei BLAS-Bibliotheken zu verknüpfen, die da unterschiedliche Konventionen haben (uBLAS macht letzteres, ATLAS ersteres). Was findet ihr besser?



  • otze schrieb:

    [cpp]
    A=untere Dreiecksmatrix
    solve(A,x,lower);//okay, A ist untere Dreiecksmatrix
    //A ist ganz klar immer noch eine untere Dreiecksmatrix
    solve(A.transpose(),x,lower);

    Aber A ist nicht der Parameter der Funktion, sondern A.transpose(), was eine obere Dreiecksmatrix ist. Sprich: Dieser Aufruf würde mich total verwirren. Eine Matriximplementierung sollte sich nach außen wie eine naive Implementierung verhalten. Wenn ich auf eine naive Implementierung transpose aufrufe, hat solve gar keine Chance mehr herauszufinden, dass der Parameter ursprünglich mal eine untere Dreiecksmatrix war.


Anmelden zum Antworten