Skip to content

Commit 127769a

Browse files
committed
Update dampedInverse function to avoid dynamic allocation.
1 parent 4699068 commit 127769a

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

include/sot/core/matrix-svd.hh

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,19 @@ void pseudoInverse( dg::Matrix& _inputMatrix,
4848
_inverseMatrix = (svd.matrixV()*singularValues_inv.asDiagonal()*svd.matrixU().transpose());
4949
}
5050

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,
5264
dg::Matrix& _inverseMatrix,
5365
dg::Matrix& Uref,
5466
dg::Vector& Sref,
@@ -57,37 +69,25 @@ void dampedInverse( dg::Matrix& _inputMatrix,
5769
sotDEBUGIN(15);
5870
sotDEBUG(5) << "Input Matrix: "<<_inputMatrix<<std::endl;
5971
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();
7078

7179
sotDEBUGOUT(15);
7280
}
7381

74-
void dampedInverse( dg::Matrix& _inputMatrix,
82+
void dampedInverse( const dg::Matrix& _inputMatrix,
7583
dg::Matrix& _inverseMatrix,
7684
const double threshold = 1e-6) {
7785
sotDEBUGIN(15);
7886
sotDEBUG(5) << "Input Matrix: "<<_inputMatrix<<std::endl;
87+
7988
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+
9191
sotDEBUGOUT(15);
9292
}
9393

0 commit comments

Comments
 (0)