令 A 为对称矩阵,令 v 为向量。我从 A 中提取从 j 开始的 n 列块并将其乘以 v 使用
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>()
还是直接执行计算?
感谢您的任何提示。
编辑:我怀疑这个问题与参数类型有关,因为我得到了错误:
invalid argument type 'typename ConstSelfAdjointViewReturnType.... to unary expression'
实际上, A 是使用 const 引用传递的函数的参数
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 告诉 Eigen M.block(1, 2, 3, 4).triangularView() 实际上是一个矩阵,而不是对矩阵的引用。否则,运算符 += 将通过一个错误,即该运算符没有为 .block() 重载。所以我最初的问题是 Matrix(...) 是否只告诉它是一个 Matrix 来启用计算,或者更确切地说将 ... 复制到一个 Matrix 中?谢谢!