@@ -48,7 +48,19 @@ void pseudoInverse( dg::Matrix& _inputMatrix,
48
48
_inverseMatrix = (svd.matrixV ()*singularValues_inv.asDiagonal ()*svd.matrixU ().transpose ());
49
49
}
50
50
51
- void dampedInverse ( dg::Matrix& _inputMatrix,
51
+ void dampedInverse ( const JacobiSVD <dg::Matrix>& svd,
52
+ dg::Matrix& _inverseMatrix,
53
+ const double threshold = 1e-6 ) {
54
+ typedef JacobiSVD<dg::Matrix>::SingularValuesType SV_t;
55
+ ArrayWrapper<const SV_t> sigmas (svd.singularValues ());
56
+
57
+ SV_t sv_inv (sigmas / (sigmas.cwiseAbs2 () + threshold * threshold));
58
+
59
+ _inverseMatrix.noalias () =
60
+ ( svd.matrixV () * sv_inv.asDiagonal () * svd.matrixU ().transpose ());
61
+ }
62
+
63
+ void dampedInverse ( const dg::Matrix& _inputMatrix,
52
64
dg::Matrix& _inverseMatrix,
53
65
dg::Matrix& Uref,
54
66
dg::Vector& Sref,
@@ -57,37 +69,25 @@ void dampedInverse( dg::Matrix& _inputMatrix,
57
69
sotDEBUGIN (15 );
58
70
sotDEBUG (5 ) << " Input Matrix: " <<_inputMatrix<<std::endl;
59
71
JacobiSVD<dg::Matrix> svd (_inputMatrix, ComputeThinU | ComputeThinV);
60
- JacobiSVD<dg::Matrix>::SingularValuesType m_singularValues=svd.singularValues ();
61
- JacobiSVD<dg::Matrix>::SingularValuesType singularValues_inv;
62
- singularValues_inv.resizeLike (m_singularValues);
63
- for ( long i=0 ; i<m_singularValues.size (); ++i) {
64
- singularValues_inv (i)=m_singularValues (i)/(m_singularValues (i)*m_singularValues (i)+threshold*threshold);
65
- }
66
- dg::Matrix matrix_U (svd.matrixU ());
67
- dg::Matrix matrix_V (svd.matrixV ());
68
- _inverseMatrix = (matrix_V*singularValues_inv.asDiagonal ()*matrix_U.transpose ());
69
- Uref = matrix_U; Vref = matrix_V; Sref = m_singularValues;
72
+
73
+ dampedInverse (svd, _inverseMatrix, threshold);
74
+
75
+ Uref = svd.matrixU ();
76
+ Vref = svd.matrixV ();
77
+ Sref = svd.singularValues ();
70
78
71
79
sotDEBUGOUT (15 );
72
80
}
73
81
74
- void dampedInverse ( dg::Matrix& _inputMatrix,
82
+ void dampedInverse ( const dg::Matrix& _inputMatrix,
75
83
dg::Matrix& _inverseMatrix,
76
84
const double threshold = 1e-6 ) {
77
85
sotDEBUGIN (15 );
78
86
sotDEBUG (5 ) << " Input Matrix: " <<_inputMatrix<<std::endl;
87
+
79
88
JacobiSVD<dg::Matrix> svd (_inputMatrix, ComputeThinU | ComputeThinV);
80
- JacobiSVD<dg::Matrix>::SingularValuesType m_singularValues=svd.singularValues ();
81
- JacobiSVD<dg::Matrix>::SingularValuesType singularValues_inv;
82
- singularValues_inv.resizeLike (m_singularValues);
83
- for ( long i=0 ; i<m_singularValues.size (); ++i) {
84
- singularValues_inv (i)=m_singularValues (i)/(m_singularValues (i)*m_singularValues (i)+threshold*threshold);
85
- }
86
- dg::Matrix Uref (svd.matrixU ());
87
- dg::Matrix Vref (svd.matrixV ());
88
-
89
- _inverseMatrix = (Vref*singularValues_inv.asDiagonal ()*Uref.transpose ());
90
-
89
+ dampedInverse (svd, _inverseMatrix, threshold);
90
+
91
91
sotDEBUGOUT (15 );
92
92
}
93
93
0 commit comments