Ich habe Zugriff auf eine Reihe von Matrix-Bibliotheken, aber für dieses Projekt verwende ich Eigen, aufgrund seiner Definition der Kompilierungszeit und seiner Einbeziehung von SVD.Effiziente Matrix Transponierte Matrix Multiplikation in Eigen
Nun, ich mache die folgende Operation:
Eigen::Matrix<double,M,N> A; // populated in the code
Eigen::Matrix<double,N,N> B = A.transpose() * A;
Wie ich verstehe, dies macht eine Kopie von A und bildet die transponieren, die wiederum von A multipliziert wird. Diese Operation wird auf relativ kleinen Matrizen durchgeführt (M = 20-30, N = 3), aber viele Millionen Male pro Sekunde, was bedeutet, dass sie so schnell wie möglich sein muss.
ich gelesen, dass die folgende Verwendung schneller ist:
B.noalias() = A.transpose() * A;
Ich konnte mein eigenes Unterprogramm schreiben, die A als Eingabe akzeptiert und füllt B, aber ich frage mich, ob es eine effiziente, bestehende Implementierung, die verwendet die geringste Anzahl von Zyklen.
Betrachten Sie dies: http://scicomp.stackexchange.com/questions/25283/beating-typical-blas-libraries-matrix-multiplication-performance –
Hilft das? http://stackoverflow.com/questions/39606224/does-eigen-have-self-transpoin-multiply-optimization-like-h-transpoheh – kennytm