我是寫了個慣性導航的卡爾曼濾波的初始對準程式,有大量的矩陣浮點數運算,release模式下收斂,重復實驗結果也很穩定精確。但是到了debug模式下就漸漸發散,最后結果誤差很大。這是為什么呢??
目前問題定位在卡爾曼濾波的量測更新部分,這部分涉及到除法,矩陣是以二維陣列形式存盤的,和這個有關系嗎?
如何使debug模式也變得和release一樣呢?
uj5u.com熱心網友回復:
https://stackoverflow.com/questions/141752/float-values-behaving-differently-across-the-release-and-debug-buildshttps://docs.microsoft.com/en-us/cpp/build/reference/fp-specify-floating-point-behavior?redirectedfrom=MSDN&view=vs-2019
可以參考這兩篇文章試一下(抱歉本人許久沒用過vs了,也沒條件搭環境驗證),說的主要兩點:(1)編譯優化級別試著設定成一樣(2)浮點/fp選項設定成一樣。
uj5u.com熱心網友回復:
多謝,不過我設定了還是不行。我的出問題的代碼在這里void CKalman::MeasUpdate(double fading = 1.0)
{
ek = Zk - (Hk*Xk);
Py0 = Hk * Pk * (~Hk);
for(int i=0; i<r; i++)
{
Hi = Hk.chooserc('R',i);//選擇第i行
Pxz = Pk * (~Hi);
double Pzz = ((Hi*Pxz)(0)) + (Rk(i,i));
ASSERT(Pzz != 0);
Kk = Pxz * (1.0/Pzz);
Xk = Xk + Kk * ( (Zk(i))-((Hi*Xk)(0)) );
Pk = Pk - Kk*Hi*Pk;
}
beta = beta / (beta + b);
if(fading>1.0) Pk = Pk*fading;
}
這是量測更新,里邊涉及到的矩陣元素都是double的
uj5u.com熱心網友回復:
難道是我的計算順序有什么錯誤嘛?
uj5u.com熱心網友回復:
剛剛發現下邊這兩句
Pk = Pk - Kk*Hi*Pk;
Pk = (I - Kk*Hi)*Pk;//I為單位矩陣
按理說是等效的,在release模式下確實計算結果完全一致,但是在debug模式下竟然不一樣,而且差很多,為啥嘞?
uj5u.com熱心網友回復:
涉及科學計算的代碼,最好用intel c++編譯,這個浮點優化更好,而且精度會更高一些,如果精度要求更高的話,還可以用intel DFP,十進制浮點庫uj5u.com熱心網友回復:
ASSERT(Pzz != 0);=====================
這種代碼就是錯誤的,因為double是0.0000000001111 不能同0比較,自己查看相關代碼。
uj5u.com熱心網友回復:
你可以設定一下,release也能除錯,從此告別debug。uj5u.com熱心網友回復:
ASSERT(Pzz != 0);
=====================
這種代碼就是錯誤的,因為double是0.0000000001111 不能同0比較,自己查看相關代碼。
多謝,這一句確實不該這么寫,不過還是沒解決我的問題
代碼查了好多遍了,目前懷疑是不是多載運算子*的問題,矩陣連乘導致的問題嗎?檢查了下乘法寫的也沒問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8132.html
標籤:C++ 語言
上一篇:是豬和不是豬
