Ich versuche, die cholesky-Zerlegung des Produkts einer Matrix mit seiner Transponierung zu nehmen, unter Verwendung von Eigen und C++ 11 "Auto" -Typ. Das Problem kommt, wenn ich versuche zu tunEigen- und C++ 11-Typ-Inferenz scheitert für Cholesky des Matrixprodukts
auto c = a * b
auto cTc = c.tranpose() * c;
auto chol = cTc.llt();
Ich verwende XCode 6.1, Eigen 3.2.2. Der Typfehler, den ich bekomme, ist here.
Dieses minimale Beispiel zeigt das Problem an meinem Computer. Ändern Sie den Typ c
von auto
zu MatrixXd
, damit es funktioniert.
#include <iostream>
#include <Eigen/Eigen>
using namespace std;
using namespace Eigen;
int main(int argc, const char * argv[]) {
MatrixXd a = MatrixXd::Random(100, 3);
MatrixXd b = MatrixXd::Random(3, 100);
auto c = a * b;
auto cTc = c.transpose() * c;
auto chol = cTc.llt();
return 0;
}
Gibt es eine Möglichkeit, dies zu tun, während immer noch Auto verwenden?
Als eine Nebenfrage, gibt es einen Leistungsgrund, die Matrix nicht zu bestätigen ist ein MatrixXd
in jeder Phase? Die Verwendung von Auto würde es Eigen erlauben, die Antwort als irgendeinen seltsamen Template-Ausdruck zu behalten, den es sich vorstellt. Ich bin mir nicht sicher, ob das Tippen als MatrixXd Probleme verursachen würde oder nicht.
Danke - es ist wirklich großartig, von einem Entwickler der Bibliothek zu hören! Mein Grund dafür war zu sehen, ob Eigen 'm0.transpose() * m1.transpose() * m2 * m3' richtig optimieren konnte, wenn sie brauchbare Formen haben - daher wollte ich alles bis zur letzten Minute im Expression-Raum behalten. Ist es aufgrund der Funktionsweise von Templates so, dass ich keine choleske Dekomposition eines GeneralProdukts nehmen kann, ist es nur, dass sich noch niemand darum gekümmert hat, es zu Eigen hinzuzufügen oder gibt es einen Grund, warum es dumm ist? – c0g