我编写了一个使用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++
答案 0 :(得分:2)
看起来不错,我只想尝试一些事情:
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。