本征中范数、归一化和归一化之间的区别
Difference between norm, normalize and normalized in eigen
假设我有一个名为 A
的 MatrixXcf
。我想用相对于相应列的标准化元素替换每一列的元素。我写了下面的代码,但这不是真的!
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();
其次:
normalize
- 就地规范化编译时已知向量(如在编译时已知为向量的向量中),returns 无。
normalized
- Returns 以上为构造副本,不影响class。您可以使用它来分配 - Vector normCopy = vect.normalized()
.
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
假设我有一个名为 A
的 MatrixXcf
。我想用相对于相应列的标准化元素替换每一列的元素。我写了下面的代码,但这不是真的!
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();
其次:
normalize
- 就地规范化编译时已知向量(如在编译时已知为向量的向量中),returns 无。normalized
- Returns 以上为构造副本,不影响class。您可以使用它来分配 -Vector normCopy = vect.normalized()
.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