Mic*_*ine 2 c++ algorithm math opencv eigen
我使用OpenCV和Eigen来计算SVD:
Eigen:
JacobiSVD<Matrix3f> svd(myM, ComputeFullU);
OpenCV:
cvSVD(&myM, &w, &u, 0, CV_SVD_MODIFY_A | CV_SVD_U_T);
Run Code Online (Sandbox Code Playgroud)
我专注于左奇异向量:
Eigen result:
0.0341698 -0.064916 0.997306
0.950241 -0.307051 -0.0525437
0.309635 0.949476 0.051194
OpenCV result:
[0.03417001163639093, -0.06491612525262211, 0.9973055233913801;
-0.9502414121501213, 0.3070511298822651, 0.05254390804810754;
-0.3096347347112595, -0.9494764348419663, -0.05119404985032185]
Run Code Online (Sandbox Code Playgroud)
尽管一个是浮点型而另一个是双类型,但计算的左奇异向量具有不同的符号.所以我的问题是:
不,这没关系,因为相应的符号差异也会出现在右侧奇异向量上,所以基本上也是如此
U * S * V^adjoint
Run Code Online (Sandbox Code Playgroud)
会给你正确的结果.
更准确地说,来自维基百科:
非简并奇异值总是具有唯一的左奇异向量和右奇异向量,直到乘以单位相位因子
exp(i?)(对于真实情况直到符号).因此,如果M的所有奇异>值都是非简并且非零,则其奇异值分解是唯一的,直到U的列乘以单位相位因子并且同时将V的相应列乘以相同的单位相位因子.
你为什么要他们一样?如果你真的想要,你可以通过划分第一个组件来获得相位,然后通过乘以该相位使它们相等.
由于奇异值的排序,也可能出现另外的差异,afaik eigen按递减顺序排序,不确定opencv.