Eigen中norm、normalize、normalized的区别

本文详细介绍了Eigen库中向量和矩阵的norm、normalize及normalized方法的区别。norm()函数计算向量的二范数或矩阵的弗罗贝尼乌斯范数;normalize()将向量或矩阵元素按范数归一化,不返回值;normalized()则返回一个新的归一化后的向量或矩阵副本,不改变原对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Eigen中norm、normalize、normalized的区别

norm()

对于Vector,norm返回的是向量的二范数,即

\|\mathbf{x}\|_{2}=\sqrt{\sum_{i=1}^{N} x_{i}^{2}}

例如:

Vector2d vec(3.0,4.0);
cout << vec.norm() << endl;	//输出5

对于Matrix,norm返回的是矩阵的弗罗贝尼乌斯范数(Frobenius Norm),即

\|\mathrm{A}\|_{F} \equiv \sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n}\left|a_{i j}\right|^{2}}

例如:

Matrix2d mat;
mat << 1,2
    3,4;
cout << mat.norm() << endl;    //输出sqrt(1*1+2*2+3*3+4*4),即sqrt(30) = 5.47723

normalize()

清楚了norm()的定义后,normalize()其实就是把自身的各元素除以它的范数。返回值为void。

例如:

vec.normalize();
cout << vec << endl;    //输出:      0.6
                       //            0.8

mat.normalize();        //mat各元素除以mat.norm()
cout << mat << endl;    

normalized()

而normalized()与normalize()类似,只不过normalize()是对自身上做修改,而normalized()返回的是一个新的Vector/Matrix,并不改变原有的矩阵

### Eigen库中 `normalized()` 函数的使用说明 `normalized()` 是 Eigen 库中的一个重要成员函数,主要用于计算向量的单位化版本。该函数会返回一个新的向量,其方向与原向量相同,但长度被标准化为 1(即模长为 1)。需要注意的是,调用此方法不会修改原始向量的内容。 以下是关于 `normalized()` 的具体细节: #### 定义与功能 `normalized()` 将向量除以其欧几里得范数(L2 范数),从而得到一个单位向量[^3]。如果希望直接改变原有向量使其成为单位向量,则可以使用 `normalize()` 方法,它会对当前对象进行就地操作并返回 void 值。 #### 返回值类型 当调用某个 Vector 对象上的 `normalized()` 方法时,返回的结果仍然是同类型的 Vector 实例。 #### 示例代码展示 下面提供了一段完整的 C++ 程序演示如何利用 Eigen 来实现向量的规范化过程: ```cpp #include <iostream> #include <Eigen/Dense> int main(){ // 创建一个三维列向量 Eigen::Vector3d vec(4.0, 3.0, 0.0); std::cout << "Original vector:\n" << vec << "\n\n"; // 计算 norm (Euclidean length) double len = vec.norm(); std::cout << "Norm of the original vector: " << len << "\n\n"; // 使用 normalized() 获取单位向量 Eigen::Vector3d unitVec = vec.normalized(); std::cout << "Normalized vector using .normalized():\n" << unitVec << "\n\n"; // 验证新向量确实已被标准化 std::cout << "Norm after normalization should be close to 1: " << unitVec.norm() << "\n"; return 0; } ``` 上述程序首先创建了一个具有特定数值的三維向量实例;接着打印出这个初始状态下的向量及其对应的 L2 范数值;之后通过调用 `.normalized()` 得到新的单位向量,并再次确认经过转换后的向量是否满足预期条件 —— 即其长度接近于 1。 #### 特殊情况考虑 应当注意,在实际应用过程中可能会遇到零向量的情况。由于零向量无法定义唯一的方向,因此尝试对其进行 normalize 或者 normalized 操作将会引发异常或者未定义行为。所以在正式执行这些操作之前最好先验证输入数据的有效性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值