我在我的软件(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)
最佳答案
好的,结合了你们在评论中给我的建议,我尝试了一些随机修复,并解决了问题。
当我创建 Eigen::Matrix3d 对象时,我没有初始化这些值,因此当我添加第一个 OuterVector[i] 时,这两个值就会变得疯狂((0,1) 变得疯狂)到 nan ,(1,2) 到 inf)。奇怪的是,这种情况只发生在这两个特定值上,并且每次都以相同的方式发生。
这样做(在初始化时)
Matrix3d AverageProduct << 0,0,0,0,0,0,0,0,0;
足以修复它。
关于c++ - 产生 NaN 和 -inf 值的矩阵特征和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046622/