Sei A eine symmetrische Matrix und sei v ein Vektor. Ich Auszug aus einem Block von n Spalten von j beginnen und durch v multiplizierenC++ Eigenes Kopieren?
VectorXd a;
a = A.middleCols(j,n).selfadjointView<Lower>() * v // does not compile
Da dies mit nicht kompiliert, während dies
a = MatrixXd(A.middleCols(j,n).selfadjointView<Lower>()) * v
tut, ich frage mich, ob die zweite Version macht eine Kopie von
A.middleCols(j,n).selfadjointView<Lower>()
oder führt die Berechnung direkt aus?
Danke für jeden Hinweis.
EDIT: Ich vermute, dass das Problem etwas mit dem Argument-Typen zu tun hat, wie ich den Fehler:
invalid argument type 'typename ConstSelfAdjointViewReturnType.... to unary expression'
Tatsächlich A ist das Argument einer durch konstante Referenz übergibt Funktion entweder von
mit Hierconst MatrixXd& A
const Ref<const MatrixXd>& A
ist ein Beispiel:
// this version doesn't compile
MatrixXd returnSymmetricMatrix(const MatrixXd& A, const VectorXd& v, const MatrixXd& B){
// B is a symmetric matrix
VectorXd a;
a = A.middleCols(3, 4).selfadjointView<Lower>() * v;
MatrixXd M(code_fill(){...});
// code_fill is the function filling the lower triangular part of a symmetric matrix
M.block(1, 2, 3, 4).triangularView<Lower>() += B.selfadjointView<Lower>();
return M;
}
// this version compiles
MatrixXd returnSymmetricMatrix(const MatrixXd& A, const VectorXd& v, const MatrixXd& B){
// B is a symmetric matrix
VectorXd a;
a = MatrixXd(A.middleCols(3, 4).selfadjointView<Lower>()) * v;
MatrixXd M(code_fill(){...});
// code_fill is the function filling the lower triangular part of a symmetric matrix
Matrix(M.block(1, 2, 3, 4).triangularView<Lower>()) += B.selfadjointView<Lower>();
return M;
}
EDIT2 In Bezug auf meine anfängliche Frage und das Beispiel, das ich im Abschnitt Bearbeiten hinzugefügt habe, bin ich ein wenig verwirrt in Bezug auf das Kopieren. Als ich den Unterschied zwischen der Arbeits- und der nicht arbeitenden Versionen, die Linie
Matrix(M.block(1, 2, 3, 4).triangularView<Lower>()) += B.selfadjointView<Lower>();
funktioniert, weil seine linke Skala sagt zu Eigen, dass M.block (1, 2, 3, 4) .triangularView() zu verstehen ist eigentlich eine Matrix und keine Referenz auf eine Matrix. Andernfalls würde der Operator + = durch einen Fehler, dass dieser Operator nicht für .block() überladen wird. Meine ursprüngliche Frage ist also, ob Matrix (...) nur sagt, dass es eine Matrix ist, um die Berechnung zu ermöglichen, oder vielmehr die ... in eine Matrix zu kopieren? Vielen Dank!
Der Ausdruck kompiliert (und läuft) gut für mich. Können Sie zusätzliche Informationen überprüfen und hinzufügen? –
Ja, die erste sollte gut funktionieren, ich sehe es mit 'M' anstelle von' A' ... – ggael
Kannst du es zu einem [MCVE] ausmalen? –