Пусть A - симметричная матрица и v - вектор. Я выписку из блока п столбцов, начиная с J и умножить на V, используяC++ Собственная копия?
VectorXd a;
a = A.middleCols(j,n).selfadjointView<Lower>() * v // does not compile
, так как это не компилируется, тогда как это
a = MatrixXd(A.middleCols(j,n).selfadjointView<Lower>()) * v
делает, мне интересно, имеет ли второй вариант копия
A.middleCols(j,n).selfadjointView<Lower>()
или выполняет вычисления непосредственно?
Спасибо за любой намек.
EDIT: Я подозреваю, что проблема имеет что-то делать с типами аргументов, как я получаю сообщение об ошибке:
invalid argument type 'typename ConstSelfAdjointViewReturnType.... to unary expression'
Действительно, аргумент функции передается по константной ссылке, используя один из
const MatrixXd& A
const Ref<const MatrixXd>& A
Вот пример:
// 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 Что касается моего первоначального вопроса и примера, который я добавил в разделе «Редактирование», я немного смущен относительно копирования. Как я понимаю разницу между рабочим и нерабочих версий, линия
Matrix(M.block(1, 2, 3, 4).triangularView<Lower>()) += B.selfadjointView<Lower>();
работает, потому что его LHS рассказывает Эйген, что M.block (1, 2, 3, 4) .triangularView() на самом деле матрица, а не ссылка на матрицу. В противном случае оператор + = выполнил бы ошибку, чтобы этот оператор не был перегружен для .block(). Итак, мой первоначальный вопрос заключается в том, говорит ли Матрица (...), что это матрица, позволяющая вычислять, или, скорее, копировать ... в матрицу? Благодаря!
Выражение (и работает) отлично подходит для меня. Можете ли вы дважды проверить и добавить какую-либо дополнительную информацию? –
Да, первый должен работать нормально, я вижу, что он использует 'M' вместо' A' ... – ggael
Можете ли вы использовать его для [MCVE]? –