假设我有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
之间的区别是什么?
答案 0 :(得分:5)
首先,您可以使用normalize
进行规范化,因此您的代码应为:
for (int i = 0; i < A.cols(); i++)
A.col(i).normalize();
其次:
normalize
- 将编译时已知的向量规范化(如在编译时已知为向量的向量),不返回任何内容。normalized
- 将上述内容作为构造副本返回,不会影响该类。您可以使用它来分配 - Vector normCopy = vect.normalized()
。norm
- 返回矩阵的范数值。即,所有矩阵条目的平方和的平方根。所以区别在于,每个函数为您返回的内容。
答案 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