69 const Eigen::MatrixBase<MatrixA>& A,
70 Eigen::MatrixBase<MatrixUV>&
U,
71 Eigen::MatrixBase<VectorS>& S,
72 Eigen::MatrixBase<MatrixUV>&
V,
73 Eigen::MatrixBase<VectorS>& tmp,
77 const int rows = A.rows();
78 const int cols = A.cols();
82 int i(-1),its(-1),j(-1),jj(-1),k(-1),nm=0;
85 e_scalar maxarg1,maxarg2,anorm(0),c(0),f(0),h(0),s(0),scale(0),
x(0),
y(0),
z(0),g(0);
90 for (i=0;i<cols;i++) {
96 for (k=i;k<rows;k++) scale +=
fabs(
U(k,i));
100 for (k=i;k<rows;k++) {
108 for (j=ppi;j<cols;j++) {
110 for (s=0.0,k=i;k<rows;k++) s +=
U(k,i)*
U(k,j);
113 for (k=i;k<rows;k++)
U(k,j) += f*
U(k,i);
115 for (k=i;k<rows;k++)
U(k,i) *= scale;
121 if ((i <rows) && (i+1 != cols)) {
123 for (k=ppi;k<cols;k++) scale +=
fabs(
U(i,k));
125 for (k=ppi;k<cols;k++) {
133 for (k=ppi;k<cols;k++) tmp(k)=
U(i,k)/h;
134 for (j=ppi;j<rows;j++) {
135 for (s=0.0,k=ppi;k<cols;k++) s +=
U(j,k)*
U(i,k);
136 for (k=ppi;k<cols;k++)
U(j,k) += s*tmp(k);
138 for (k=ppi;k<cols;k++)
U(i,k) *= scale;
143 anorm = maxarg1 > maxarg2 ? maxarg1 : maxarg2;
146 for (i=cols-1;i>=0;i--) {
149 for (j=ppi;j<cols;j++)
V(j,i)=(
U(i,j)/
U(i,ppi))/g;
150 for (j=ppi;j<cols;j++) {
151 for (s=0.0,k=ppi;k<cols;k++) s +=
U(i,k)*
V(k,j);
152 for (k=ppi;k<cols;k++)
V(k,j) += s*
V(k,i);
155 for (j=ppi;j<cols;j++)
V(i,j)=
V(j,i)=0.0;
162 for (i=cols-1<rows-1 ? cols-1:rows-1;i>=0;i--) {
165 for (j=ppi;j<cols;j++)
U(i,j)=0.0;
168 for (j=ppi;j<cols;j++) {
169 for (s=0.0,k=ppi;k<rows;k++) s +=
U(k,i)*
U(k,j);
171 for (k=i;k<rows;k++)
U(k,j) += f*
U(k,i);
173 for (j=i;j<rows;j++)
U(j,i) *= g;
175 for (j=i;j<rows;j++)
U(j,i)=0.0;
181 for (k=cols-1;k>=0;k--) {
182 for (its=1;its<=maxiter;its++) {
184 for (ppi=k;ppi>=0;ppi--) {
186 if ((
fabs(tmp(ppi))+anorm) == anorm) {
190 if ((
fabs(S(nm)+anorm) == anorm))
break;
195 for (i=ppi;i<=k;i++) {
198 if ((
fabs(f)+anorm) == anorm)
break;
205 for (j=0;j<rows;j++) {
218 for (j=0;j<cols;j++)
V(j,k)=-
V(j,k);
231 f=((x-
z)*(x+
z)+h*((y/(f+
SIGN(g,f)))-h))/
x;
235 for (j=ppi;j<=nm;j++) {
249 for (jj=0;jj<cols;jj++) {
264 for (jj=0;jj<rows;jj++) {
278 for (i=0; i<cols; i++){
282 for (j=i+1; j<cols; j++){
296 U.col(i).swap(
U.col(i_max));
297 V.col(i).swap(
V.col(i_max));
int svd_eigen_HH(const Eigen::MatrixBase< MatrixA > &A, Eigen::MatrixBase< MatrixUV > &U, Eigen::MatrixBase< VectorS > &S, Eigen::MatrixBase< MatrixUV > &V, Eigen::MatrixBase< VectorS > &tmp, int maxiter=150)