【发布时间】:2014-01-29 13:29:40
【问题描述】:
在我的软件(c++ 中)中使用 Eigen (Tuxfamily) 时遇到一个奇怪的问题。
我正在通过为每个像素计算一个 Hessian 矩阵来分析 3D 体积图像。 体积(大约 800x800x600)被划分为子体积,对于每个子体积,我将所有获得的矩阵相加,然后将它们除以数量以获得平均值(然后我将所有平均值相加并除以数量)子卷来获得全卷的平均值)。
矩阵的类型为 Matrix3d。 问题是,对于大多数总和(显然也是平均值),我得到了类似的东西:
元素分析:28215
元素总和:28215
子卷总和:
5143.76 |南 | -2778.05
5402.07 | 16011.9 | -inf
-2778.05 | -8716.86 | 7059.32
我是这样总结的:
for(int i = 0;i<(int)OuterVector.size();i++){
AverageProduct+=OuterVector[i];
}
由于矩阵的性质,我知道它们应该在对角线上对称,因此为其中一些计算了正确的值。知道为什么其他人可能会失败吗? (并认为它总是给我 nan 和 -inf 的矩阵的相同两个位置)
【问题讨论】:
-
我没有答案,但是有 C++ 函数可以确定某个东西是
nan还是inf。您可以在调试代码中调用std::isnan()和std::isinf()来确定它们的来源。一旦知道了这一点,您就可以从那里向后工作以找出哪个计算正在为该元素生成它们。一旦你得到一个,它们往往会级联并导致所有后续计算产生nan或inf结果。 -
您可能可以使用您的调试器来中断 NaN 的生成。对于 UNIX 平台,请参阅此答案:stackoverflow.com/a/5394095/1401351,对于 MSVC,请参阅此答案:stackoverflow.com/q/4454582/1401351
-
在不了解所有其他内容的情况下很难判断。你能创建一个Short, Self Contained, Compilable, Example 吗?在创建后立即检测第一个损坏的矩阵(可能使用先前评论中的
isnan和isinf)然后以足够的精度打印其输入,并查看是否可以用来重现问题。如果是这样,还请查看您现在是否已经了解问题的根源,在这种情况下,您也可以回答自己的问题。否则,请发布 SSCCE,我们会仔细查看。 -
这与您的问题无关,但如果 OuterVector 是 Eigen 对象,那么您可以使用 OuterVector.sum() 而不是手动 for 循环。