43void SVD(
const MatT& A, MatT& U, MatT& S, MatT& V) {
45 int m = A.rows(), n = A.cols();
46 int MaxMatDim = std::pow(std::max(m,n),2);
47 double SVD[3 * MaxMatDim];
55 double U_temp[MaxMatDim], V_temp[MaxMatDim];
57 Eigen::Map<MatT>(U_temp, m, n) = A;
61 Utmp = Eigen::Map<MatT>(U_temp, m, m);
62 Vtmp = Eigen::Map<MatT>(V_temp, n, n);
64 for (
int i = 0; i < MaxMatDim; i++)
69 for (
int i = 0; i < n; i++) {
72 for (
int j = i+1; j < n; j++) {
80 int tmpindex = index[i];
82 index[i] = index[index_max];
84 index[index_max] = tmpindex;
87 Vtmp.conservativeResize(n, n);
88 Utmp.conservativeResize(m, std::max(m, n));
90 U = Utmp.block(0, index[0], m, 1);
91 V = Vtmp.block(0, index[0], n, 1);
93 for (
int i = 1; i < n; i++) {
97 for (
int i = 1; i < m; i++) {
101 U = U.block(0, 0, m, m);
108 S = S.block(0, 0, m, n);
void SVD(const MatT &A, MatT &U, MatT &S, MatT &V)
Singular Value Decomposition.
Definition SVD.h:43