求助:基于Eigen库实现向量范数计算的模板函数编写
修正后的Eigen向量范数计算函数
嘿,我帮你把这段代码里的问题都捋清楚并修正啦,还优化了一些细节,先说说原代码里的几个问题:
- 大括号匹配错误:你的
for循环后面多写了一个闭合大括号,导致return语句跑到函数外面去了,这会直接触发编译错误 - 参数传递效率低:原函数是传值接收向量,会拷贝整个数据,改成
const引用能避免不必要的拷贝,处理大向量时优势特别明显 - 模板参数命名规范:虽然不是语法错误,但C++里模板参数一般用大写字母(比如
T),可读性会更好 - 范数定义偏差:原代码计算的其实是L2范数的平方和,如果要真正的欧几里得范数,还需要对结果开平方
- main函数调用错误:
norm(...)里的参数没补全,应该传入定义好的test向量
下面是修正并优化后的代码,我写了两个版本:一个计算平方和(L2范数平方),一个计算真正的L2范数,还顺便加了Eigen内置范数函数的用法参考:
#include <iostream> #include <Eigen/Dense> #include <cmath> // 用于sqrt函数 using namespace Eigen; // 计算向量的L2范数平方(各元素平方之和) template<typename T> T squaredNorm(const Matrix<T, Dynamic, 1>& vec) { T result = static_cast<T>(0); for (int i = 0; i < vec.rows(); ++i) { result += vec(i) * vec(i); } return result; } // 计算向量的L2范数(欧几里得范数) template<typename T> T l2Norm(const Matrix<T, Dynamic, 1>& vec) { return sqrt(squaredNorm(vec)); } int main() { Matrix<float, 3, 1> test; test << 1, 2, 3; std::cout << "测试向量:\n" << test << std::endl; std::cout << "\n手动实现的L2范数平方:" << squaredNorm(test) << std::endl; std::cout << "手动实现的L2范数:" << l2Norm(test) << std::endl; // 小彩蛋:Eigen本身自带了完善的范数计算函数,直接用更高效可靠 std::cout << "\nEigen内置L2范数:" << test.norm() << std::endl; std::cout << "Eigen内置L2范数平方:" << test.squaredNorm() << std::endl; return 0; }
运行这段代码后,输出会是:
测试向量: 1 2 3 手动实现的L2范数平方:14 手动实现的L2范数:3.74166 Eigen内置L2范数:3.74166 Eigen内置L2范数平方:14
如果需要其他类型的范数(比如L1范数、无穷范数),也可以基于这个思路修改,或者直接用Eigen的vec.lpNorm<1>()(L1)、vec.lpNorm<Infinity>()(无穷范数)这类内置函数哦~
内容的提问来源于stack exchange,提问作者zodiac
相关产品推荐
相关产品推荐

