2014-01-10 5 views
2

내 소프트웨어에서 Eigen (Tuxfamily)을 사용하는 데 이상한 문제가 있습니다 (C++).NaN 및 -inf 값으로 나타나는 행렬의 고유 합계

각 픽셀에 대해 헤센 (Hessian) 행렬을 계산하여 3D 볼륨 이미지를 분석합니다. 볼륨 (약 800x800x600)은 서브 볼륨으로 나뉘며 각 서브 볼륨에 대해 얻은 모든 매트릭스를 요약 한 다음 평균을 얻기 위해 양으로 나눕니다 (그리고 나서 평균을 모두 합하여 동일한 평균을 구한 다음 숫자로 나눕니다) 전체 볼륨에 대한 평균을 얻기 위해 서브 볼륨의 수).

매트릭스의 유형은 Matrix3d입니다. 문제는 그 난 같은 획득 (뿐만 아니라 평균위한 분명하고) 합 대부분 : 분석

요소 : 28,215

요소 합산 : 28,215

서브 볼륨 합계 :

5143.76 | 남 | -2778.05

5402.07 | 16011.9 | -inf

-2778.05 | -8716.86 |

for(int i = 0;i<(int)OuterVector.size();i++){ 
    AverageProduct+=OuterVector[i]; 
} 

때문에 나는 그들이 대각선 대칭 것을 알고 행렬의 성격에, 그래서 올바른 값은 그들 중 일부에 대해 계산됩니다 : 7059.32

나는 그들에게이 방법을 요약. 왜 다른 사람들이 실패 할 지에 대한 어떤 생각? (그리고 그것은 항상 nan과 -inf를주는 행렬의 동일한 두 위치라고 생각하십시오)

+3

답변이 없지만 무언가가 '나노'또는 'inf'인지 확인하기위한 C++ 기능이 있습니다. ['std :: isnan()'] (http://en.cppreference.com/w/cpp/numeric/math/isnan)과 ['std :: isinf()'] (http : // en.cppreference.com/w/cpp/numeric/math/isinf)를 디버그 코드에 넣어서 어디서 왔는지 알아낼 수 있습니다. 그 점을 알고 있으면 거기에서 거꾸로 작업하여 계산을 계산할 수 있습니다 그 요소에 대해서. 일단 당신이 하나를 얻으면, 그들은 캐스 캐 이드 (cascade)하고 모든 후속 계산이'nan' 또는'inf' 결과를 생성하는 경향이 있습니다. – user1118321

+0

디버거를 사용하여 NaN 생성을 중단 할 수 있습니다. UNIX-ish 플랫폼의 경우이 답변을 참조하십시오. http://stackoverflow.com/a/5394095/1401351 및 MSVC 용이 답변 : http://stackoverflow.com/q/4454582/1401351 – Peter

+0

모두 모르는 사이에 말하기가 어렵습니다. 다른 것들. [Short, Self Contained, Compilable, Example] (http://sscce.org/)를 만들 수 있습니까? 생성 된 직후에 첫 번째로 깨진 행렬을 검출하고 (아마도 이전의 주석에서 'isnan'과'isinf'를 사용하여) 충분한 정밀도로 입력을 인쇄하고 그 문제를 재현하는 데 사용할 수 있는지 확인하십시오.그렇다면 문제의 원인을 이미 이해했는지 확인하십시오.이 경우 문제의 원인을 직접 해결할 수도 있습니다. 그렇지 않으면 SSCCE를 게시하면 더 자세히 살펴볼 것입니다. – MvG

답변

3

여러분이 의견에 저에게 준 제안을 사용하여, 몇 가지 무작위적인 수정을 시도해 보았습니다. 문제.

내가 Eigen :: Matrix3d ​​개체를 만들 때 값을 초기화하지 않아서 어떻게 든 첫 번째 OuterVector [i]를 추가하자마자 그 두 값이 거칠어졌습니다 ((0,1)). nan에 가면 (1,2)가 inf가 될 것입니다.) 이상한 점은 그 두 가지 구체적인 가치에 대해서만 매번 똑같은 방식으로 일어나는 것이 었습니다.

그래서

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

이 문제를 해결하기에 충분했다 (초기화시)하고.

+2

이것을 'AverageProduct.setZero()'로 일반화 할 수 있습니다. –