C++矩阵库Armadillo出现warning solve() system is singular错误的解决

本文介绍使用C++ 语言的矩阵库Armadillo 时,出现报错system is singular; attempting approx solution的解决方法。

在之前的文章中,我们介绍过Armadillo矩阵库在Visual Studio软件C++环境中的配置方法https://blog.csdn.net/zhebushibiaoshifu/article/details/127123511),并且也介绍过[Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换](https://blog.csdn.net/zhebushibiaoshifu/article/details/128274327)(https://blog.csdn.net/zhebushibiaoshifu/article/details/128274327)。而在使用**Armadillo** 模块加以矩阵计算时,出现了1个问题------我这里会经常出现warning: solve(): system is singular; attempting approx solution字样的报错。而且因为我代码中调用Armadillo模块加以矩阵计算的次数非常多,导致这个报错会出现非常多次,如下图所示。

虽然这个错误倒不会引发程序中断,程序还是会继续运行,相当于这个warning只是1个输出提示信息而已;但是,如果大量出现这种报错提示信息,会使得原本程序运行的速度被拖慢。如下图所示,我这里需要循环4710万次,如果一直出现这个报错的话就会使得程序运行很慢。

因此,需要对这个报错加以解决。

之所以出现这个错误,是因为Armadillo 模块在执行矩阵计算时,遇到了秩缺陷系统 ,导致某些数值求解方法可能无法找到精确的解,进而导致其需要尝试找到近似解------此时,就会触发这个报错提示。其中,当线性方程组的系数矩阵不是满秩矩阵时,其被称为秩缺陷系统

解决的思路也很简单,一个是直接隐藏这个级别的错误提示------相当于还是有这个问题,但是不让他再输出这个错误提示了;还有一个就是针对这个出错的原因加以处理。

首先先看第一个思路。在Armadillo模块的官方网站中,提到了取消这个错误提示的方法,如下图所示。

我们只需要在代码最开头,在#include <armadillo>这句代码前,添加如下的代码,从而将上述错误提示信息隐藏掉,在之后每次运行程序时屏蔽这个报错。

c++ 复制代码
#define ARMA_WARN_LEVEL 1

添加上述代码,如下图所示。

此时,再运行我这里的程序,就会发现原本的错误提示信息消失了;如下图所示,不再出现原本的错误提示信息,而是直接输出了代码的进度提示。

第二种思路,就是从报错的源头代码入手,避免出现这个错误。

在本文的代码中,是在调用Armadillo 模块的solve()函数时出现这个错误的;如下图所示。

对于此,我们可以在solve()函数中添加solve_opts::no_approx这个参数,使得solve()函数不要寻找近似解;如下图所示。

当然,这种方法就会带来1个新的问题------既然我们通过这种方式,设定了solve()函数不能找近似解;那么与此同时,如果精确解也无法找到的话,就会直接报错。如下图所示,本文这个场景下,solve()函数就无法找到精确解;那么如果我用上面的方式,不让他找近似解,就会直接报错。

从上图的报错中点进来,可以发现报错的代码就是solve()函数这里;如下图所示。

所以,对于本文这种场景,我们就只能用第1种思路,通过隐藏报错信息来解决这一问题了。

至此,大功告成。

欢迎关注:疯狂学习GIS

相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
一只小bit4 小时前
C++之初识模版
开发语言·c++
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
北顾南栀倾寒7 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
old_power8 小时前
【PCL】Segmentation 模块—— 基于图割算法的点云分割(Min-Cut Based Segmentation)
c++·算法·计算机视觉·3d
涛ing8 小时前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
PaLu-LI9 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉