Armadillo库如何处理错误?

时间:2014-06-25 06:12:06

标签: c++ armadillo

刚刚开始使用Armadillo图书馆。通过文档和常见问题解答,我没有找到任何关于Armadillo如何处理错误的参考。例如,我怎么知道“mat A(1e10,1e10)”是否成功?

2 个答案:

答案 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:我建议对特定领域的新手采取不那么苛刻的态度,这对社区健康更有利。强迫他人阅读不完整的文档并不是一个建设性的意见。事实上,大多数优秀的开源项目都带有不太好的文档,这就是为什么我们应该帮助它们更清晰,更友好。