我编写了一个使用Armadillo svd_econ函数的函数.我正在尝试处理svd无法收敛的情况,因为在某些情况下它不会中止该函数.
有问题的错误是:
error: svd_econ(): failed to converge
基于我对SVD documentation的读取,这应该抛出一个std :: runtime_error,并根据我对Exceptions tutorial的读取,我应该能够像这样处理它:
arma::mat U, V;
arma::vec S;
try {
// aDat and subsetRows are previously defined
arma::svd_econ(U, S, V, aDat.rows(subsetRows), "right", "dc");
} catch (std::runtime_error e) {
std::cout << "Exception caught!" << std::endl;
// I want to abort, and return the error to R:
throw Rcpp::exception(e.what());
}
但是,当我运行此代码的情况下给出了上面的错误消息时,我得到了一个段错误.如果我删除try-catch块,代码将继续运行,并在代码尝试使用SVD的结果时进一步向下抛出错误.
因为我没有正式学习任何C,所以我认为我只是遗漏了一些明显的东西
最佳答案 看起来不错,我只想尝试一些事情:
>对例外的引用,
>只是错误转发到R,而不是另一个throw(),
>带有Rf_error()的默认块
也许(未经测试)
try {
arma::svd_econ(U, S, V, aDat.rows(subsetRows), "right", "dc");
} catch (std::runtime_error & e) {
std::cout << "Exception caught!" << std::endl;
forward_exception_to_r(e);
} default(...) {
Rf_error("Unknown exception");
}
但实际上你可以通过Rcpp属性免费获得所有这些,因为这是(自动插入的)END_RCPP宏所做的事情—有关详细信息,请参阅Rcpp书的第2.7节.
编辑但@mtall在他的评论中做了我们应该首先做的事情:检查Armadillo文档.所以你只需检查返回值即可.但您也可以尝试使用建议的try / catch.