标准,归一化和归一化的区别

时间:2017-12-29 07:51:06

标签: c++ eigen

假设我有MatrixXcf名为A。我想用相对于相应列的标准化元素替换每列的元素。我写过以下代码,但事实并非如此!

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

以及另一个问题,norm()normalize()normalized()Eigen之间的区别是什么?

2 个答案:

答案 0 :(得分:5)

首先,您可以使用normalize进行规范化,因此您的代码应为:

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

其次:

  1. normalize - 将编译时已知的向量规范化(如在编译时已知为向量的向量),不返回任何内容。
  2. normalized - 将上述内容作为构造副本返回,不会影响该类。您可以使用它来分配 - Vector normCopy = vect.normalized()
  3. norm - 返回矩阵的范数。即,所有矩阵条目的平方和的平方根。
  4. 所以区别在于,每个函数为您返回的内容。

答案 1 :(得分:2)

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

  • norm()Frobenius norm,是组件平方和的平方根。

  • .normalized()将副本返回到原始对象除以此范数(即原始对象未更改)。

  • .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