我正在尋找Mathnet.Iridium和Mathnet.Numerics之間的非迴歸。這裏是我的代碼,使用Mathnet.Numerics:與Mathnet數值庫Svd重新編譯似乎是錯誤的
double[][] symJaggedArray = new double[5][];
symJaggedArray[0] = new double[] { 3, 0, 0, 0, 0 };
symJaggedArray[1] = new double[] { 0, 2, 4, 0, 0 };
symJaggedArray[2] = new double[] { 0, 4, 5, -4, 5 };
symJaggedArray[3] = new double[] { 0, 0, -4, -8, 12 };
symJaggedArray[4] = new double[] { 0, 0, 5, 12, -5 };
symDenseMatrix = DenseMatrix.OfArray(new Matrix(symJaggedArray).CopyToArray());// not optimal but it's not the point
Svd svd = new UserSvd(symDenseMatrix , true);
Matrix<double> recompo = svd.U().Multiply(svd.W()).Multiply(svd.VT());
當我比較recompo和初始矩陣,他們是不同的。 我發現這個差異各分解矩陣與以前的實現比較時:
- U和singularValueDecomposition.LeftSingularVectors相等
- W和singularValueDecomposition.S相等
- VT和Matrix.Transpose(singulaValueDecomposition.RightSingularVectors )不同
最後,用舊API重新編譯是正確的。使用
MathNet.Numerics版本:Math.NET Numerics的V2.5.0
所以我的問題是:哪裏是我的錯誤與新的API重建初始矩陣時?
RecompoMatrix =
- 0 -1.216846655456 2.83903817786199 1.4472680220698 2.89215520227421
- 0 -2.46695399700557 0.92863757484644 8.657344064164 -0.31963101527516
- 0 0.349540484418384 8.20515629935223 -2.26741625715781 -12.3049605878983
- 0 -0.402667067831389 -6.32914150795323 9.13315298351198 8.3884053064068
你會得到一個有趣的觀點: 它會得到與你的方法m.Svd(true)相同的結果,但是如果替換爲: // var svd = m.Svd(true); var svd = new UserSvd(m,true); – FabricePA
無論如何,我標記你的答案,因爲它保存了我的迴歸。非常感謝。我打算使用Matrix.Svd()。不過,我真的認爲在UserSvd和DenseSvd中有一個問題,或者我不明白它是如何使用的。 – FabricePA
謝謝! 當我嘗試使用這兩種方法(在LINQPad中)時,我實際上得到了與DenseSvd和UserSvd完全相同的結果。所以我仍然有興趣找出問題所在,確保沒有隱藏的漏洞。 –