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);
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)