【发布时间】:2015-03-09 19:36:12
【问题描述】:
我和一个朋友正在开发一个 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 中打印出来。
【问题讨论】: