加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何在反转奇异矩阵时使Armadillo函数不打印错误?

发布时间:2020-12-16 09:56:50 所属栏目:百科 来源:网络整理
导读:一个伙伴和我正在研究一个R包,并使用RcppArmadillo包来处理一些较重的矩阵代数.到目前为止它已经非常甜蜜,但我们在矩阵求逆方面遇到了一些问题.简而言之,程序正在搜索特定类型的矩阵,并且必须检查在循环的每次迭代中是否存在更新的矩阵的逆(逆本身也是必需的
一个伙伴和我正在研究一个R包,并使用RcppArmadillo包来处理一些较重的矩阵代数.到目前为止它已经非常甜蜜,但我们在矩阵求逆方面遇到了一些问题.简而言之,程序正在搜索特定类型的矩阵,并且必须检查在循环的每次迭代中是否存在更新的矩阵的逆(逆本身也是必需的).现在我们正在使用函数inv(A,B),它返回一个布尔值,指示矩阵B是否可逆(如果不是,A设置为0x0矩阵,否则A = inv(B)).如果此函数没有打印错误,那将是很好的,因为返回的布尔值给循环提供正确进行所需的信息.并且似乎只是打印错误而不是“抛出”,如下面的程序所示:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main(int argc,char** argv)
{
    mat A = randu<mat>(5,5);
    mat B = zeros<mat>(5,5);

    inv(A,B);

    cout << A << "error printed but not fatal" << endl;

    A = inv(B);

    cout << A << "never make it this far" << endl;

    return 0;
}

导致:

Johns-MacBook-Pro:test johnsherrill$g++ armaExample.cpp -o example -O2 -larmadillo
Johns-MacBook-Pro:test johnsherrill$./example

error: inv(): matrix appears to be singular

[matrix size: 0x0]
error printed but not fatal

error: inv(): matrix appears to be singular

terminate called after throwing an instance of 'std::runtime_error'
  what():  inv(): matrix appears to be singular
Abort trap: 6

有没有办法解决这个问题,而无需先单独检查B是否可逆?这种类型的错误也印在R中.

解决方法

最简单的方法是在包含Armadillo标头之前定义ARMA_DONT_PRINT_ERRORS.

例如:

#define ARMA_DONT_PRINT_ERRORS
#include <armadillo>   // or #include <RcppArmadillo.h> if you're using Rcpp

定义描述于
http://arma.sourceforge.net/docs.html#config_hpp

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读