刚刚开始使用Armadillo图书馆。通过文档和常见问题解答,我没有找到任何关于Armadillo如何处理错误的参考。例如,我怎么知道“mat A(1e10,1e10)”是否成功?
答案 0 :(得分:3)
在向Stackoverflow提问之前,建议阅读相关文档。
Armadillo documentation的例子:
对于R = chol(X)
和chol(R, X)
函数:如果分解失败,则重置R并且chol(X)
抛出 std :: runtime_error 异常,而{{1将 bool 设置为 false 。
对于chol(R,X)
和eig_sym(X)
函数:如果X不是正方形,则抛出 std :: logic_error 异常。
对于像inv(X)
这样的运算符,如果使用不兼容的对象大小,则会抛出 std :: logic_error 异常。
对于像+
这样的元素访问,如果请求的元素超出范围,则抛出 std :: logic_error 异常。
等等。
Armadillo的源代码也可用,因此您可以直接查看它并查看它的功能。
答案 1 :(得分:3)
Armadillo的错误处理机制在其文档中并不清楚。通过与作者Sanderson的电子邮件通信,它发现Armadillo的错误处理机制实际上是C ++ std异常和C风格返回值的混合。但是,文档中仍然不完整的异常信息。
例如,要定义矩阵,我建议不使用“mat X(M,N)”,因为没有错误处理。安全的方式是这样的(C风格):
mat X;
try{
X.set_size(M, N);
} catch (...) {
printf("memory allocation failed\n");
return -1;
}
请注意,当发生内存分配错误时,将抛出异常“std :: logic_error”或“std :: bad_alloc”(请参阅mtall下面的注释),这不会放在文档中。返回时,使用“X.reset()”释放数据存储器。
和@mtall:我建议对特定领域的新手采取不那么苛刻的态度,这对社区健康更有利。强迫他人阅读不完整的文档并不是一个建设性的意见。事实上,大多数优秀的开源项目都带有不太好的文档,这就是为什么我们应该帮助它们更清晰,更友好。