【问题标题】:Eigen sum of matrices resulting in NaN and -inf values导致 NaN 和 -inf 值的矩阵的特征和
【发布时间】: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() 来确定它们的来源。一旦知道了这一点,您就可以从那里向后工作以找出哪个计算正在为该元素生成它们。一旦你得到一个,它们往往会级联并导致所有后续计算产生naninf 结果。
  • 您可能可以使用您的调试器来中断 NaN 的生成。对于 UNIX 平台,请参阅此答案:stackoverflow.com/a/5394095/1401351,对于 MSVC,请参阅此答案:stackoverflow.com/q/4454582/1401351
  • 在不了解所有其他内容的情况下很难判断。你能创建一个Short, Self Contained, Compilable, Example 吗?在创建后立即检测第一个损坏的矩阵(可能使用先前评论中的isnanisinf)然后以足够的精度打印其输入,并查看是否可以用来重现问题。如果是这样,还请查看您现在是否已经了解问题的根源,在这种情况下,您也可以回答自己的问题。否则,请发布 SSCCE,我们会仔细查看。
  • 这与您的问题无关,但如果 OuterVector 是 Eigen 对象,那么您可以使用 OuterVector.sum() 而不是手动 for 循环。

标签: c++ math matrix nan eigen


【解决方案1】:

好的,结合你们在 cmets 中给我的建议,我尝试了一些随机修复并解决了问题。

当我创建 Eigen::Matrix3d 对象时,我没有初始化这些值,所以不知何故,一旦我添加了第一个 OuterVector[i],这两个值就会变得疯狂((0,1)到 nan 和 (1,2) 将要 inf)。奇怪的是,它只发生在这两个特定的值上,并且每次都以相同的方式发生。

这样做(在初始化时)

Matrix3d AverageProduct << 0,0,0,0,0,0,0,0,0;

足以修复它。

【讨论】:

  • 您可以将其概括为AverageProduct.setZero()
猜你喜欢
  • 2017-12-01
  • 2012-08-08
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多