在我的例子中,MatrixXd对象“AA”是一个大矩阵,绝对无法复制。似乎下面的函数不应该复制它,但事实上它确实复制了它。我绝不是一个编程,当然我正在做一些可怕的错误,但我无法弄明白它是什么
void GKLBidiag(const Ref<const MatrixXd>& AA, double& eigenv, Ref<VectorXd> v, Ref<VectorXd> alpha, Ref<VectorXd> beta) {
VectorXd u(AA.rows());
VectorXd Uprev(v.size());
VectorXd Vnew(v.size());
const int kmax(alpha.size());
MatrixXd B(MatrixXd::Zero(kmax, kmax));
v.normalize();
for (int i = 0; i < kmax; i++) {
Uprev = u;
u = AA * v;
if (i > 0) {
u -= beta(i - 1) * Uprev;
//add reorthogonalization
}
alpha(i) = u.norm();
u /= alpha(i);
Vnew = AA.adjoint() * u - alpha(i) * v;
beta(i) = Vnew.norm();
v = Vnew.array() / beta(i);
}
B.diagonal() = alpha;
for (int i = 0; i < kmax - 1; i++) {
B(i, i + 1) = beta(i);
}
JacobiSVD<MatrixXd> svd(B);
eigenv = pow(svd.singularValues()(0), 2);
}
非常感谢帮助!
答案 0 :(得分:0)
我想说,当您计算伴随矩阵AA.adjoint()
时,需要额外的内存,其大小与AA
相同。