如何通过C++ Eigen库正确获取矩阵L1范数?
在Eigen中获取矩阵L1范数的便捷方法
你遇到的问题是因为Eigen的lpNorm<1>()默认将矩阵视为列向量展开来计算向量的L1范数,所以得到的是所有元素绝对值的总和,而非矩阵的L1算子范数(列绝对值和的最大值)。
最便捷的解决方案:使用operatorNorm<1>()
Eigen提供了专门计算矩阵算子范数的方法operatorNorm<p>(),其中<1>就对应矩阵的L1范数,直接调用即可:
using namespace Eigen; int main() { MatrixXd A(2, 2); A << 375.0, 374.0, 752.0, 750.0; std::cout << A << std::endl; // 计算矩阵L1范数 std::cout << "矩阵L1范数:" << A.operatorNorm<1>() << std::endl; return 0; }
这段代码的输出会是:
375 374 752 750 矩阵L1范数:1127
补充说明
operatorNorm<1>()内部已经实现了“列绝对值求和取最大值”的逻辑,和你之前的手动实现等价,但语义更清晰、调用更简洁。- 同理,Eigen还支持:
operatorNorm<2>():计算矩阵的谱范数(最大奇异值)operatorNorm<Infinity>():计算矩阵的无穷范数(行绝对值和的最大值)
内容的提问来源于stack exchange,提问作者苏茂江
相关产品推荐
相关产品推荐

