特征库:为什么我的函数在不应该复制我的论点时?

时间:2014-03-07 04:02:36

标签: c++ templates eigen

在我的例子中,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);

}

非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

我想说,当您计算伴随矩阵AA.adjoint()时,需要额外的内存,其大小与AA相同。