本征中范数、归一化和归一化之间的区别

Difference between norm, normalize and normalized in eigen

假设我有一个名为 AMatrixXcf。我想用相对于相应列的标准化元素替换每一列的元素。我写了下面的代码,但这不是真的!

for (int i = 0; i < A.cols(); i++)
    A.col(i).real.array() = A.col(i).real().array()/A.col(i).real().norm();

还有一个问题,Eigen中的norm()normalize()normalized()有什么区别?

首先,您可以使用 normalize 就地规范化,因此您的代码应该是:

for (int i = 0; i < A.cols(); i++)
    A.col(i).normalize();

其次:

  1. normalize - 就地规范化编译时已知向量(如在编译时已知为向量的向量中),returns 无。
  2. normalized - Returns 以上为构造副本,不影响class。您可以使用它来分配 - Vector normCopy = vect.normalized().
  3. norm - Returns 矩阵的范数 value。即所有矩阵项的平方和的平方根。

所以不同之处在于,每个功能 returns 适合您。

您的问题的答案可以在 manual 中找到。总结:

  • norm()Frobenius norm,分量平方和的平方根。

  • .normalized() returns原始对象的副本除以此范数(即原始对象未更改)。

  • .normalize() 将一个对象就地除以这个范数(即原始对象本身被修改)。

通过这个例子你可以说服自己:

#include <Eigen/Eigen>
#include <iostream>

int main()
{

  Eigen::VectorXd A(3);

  A(0) = 1.;
  A(1) = 2.;
  A(2) = 3.;

  std::cout << "A.norm() = " << std::endl;
  std::cout << A.norm() << std::endl;

  Eigen::VectorXd B = A.normalized();

  std::cout << "B = " << std::endl;
  std::cout << B << std::endl;
  std::cout << "A = " << std::endl;
  std::cout << A << std::endl;

  A.normalize();

  std::cout << "A = " << std::endl;
  std::cout << A << std::endl;

}

我编译了:

clang++ `pkg-config --cflags eigen3` so.cpp 

但这因系统而异。

输出:

A.norm() =
3.74166

B =
0.267261
0.534522
0.801784

A =
1
2
3

A =
0.267261
0.534522
0.801784