10 using namespace Eigen;
13 double eps,
int itermax)
26 EigenSolver<MatrixXd> eig;
30 MatrixXd eigenvectors = eig.pseudoEigenvectors();
31 MatrixXd eigenvalues = eig.pseudoEigenvalueMatrix();
37 for (
int j = 1; j < d; j++)
39 if ( eigenvalues(j,j) > eigenvalues(j-1,j-1) )
41 std::swap(eigenvalues(j,j),eigenvalues(j-1,j-1));
42 eigenvectors.col(j).swap(eigenvectors.col(j-1));
51 EV = eigenvalues.cwiseAbs().cwiseSqrt().inverse() * eigenvectors.transpose();
63 std::vector<float64_t> crit;
65 for (
int l = 0; l < L; l++)
69 Ci = 0.5 * (Ci + Ci.transpose());
70 Csi = EV * Ci * EV.transpose();
71 Rs.col(l) = Csi.diagonal();
72 crit.back() += Csi.cwiseAbs2().sum() - Rs.col(l).cwiseAbs2().sum();
77 while (improve > eps && iter < itermax)
82 for (
int id = 0;
id < d;
id++)
85 for (
int l = 0; l < L; l++)
88 C1.row(
id) += Csi.row(
id) * Rs(
id,l);
92 MatrixXd D0 = B.cwiseProduct(B.transpose()) - B.diagonal() * B.diagonal().transpose();
93 MatrixXd A0 = MatrixXd::Identity(d,d) + (C1.cwiseProduct(B) - B.diagonal().asDiagonal() * C1.transpose()).cwiseQuotient(D0+MatrixXd::Identity(d,d));
94 EV = A0.inverse() * EV;
97 MatrixXd Raux = EV * C0 * EV.transpose();
98 MatrixXd aux = Raux.diagonal().cwiseAbs().cwiseSqrt().asDiagonal().inverse();
102 for (
int l = 0; l < L; l++)
106 Csi = EV * Ci * EV.transpose();
107 Rs.col(l) = Csi.diagonal();
108 crit.back() += Csi.cwiseAbs2().sum() - Rs.col(l).cwiseAbs2().sum();
111 improve =
CMath::abs(crit.back() - crit[iter]);
T * get_matrix(index_t matIdx) const
static SGMatrix< float64_t > diagonalize(SGNDArray< float64_t > C, SGMatrix< float64_t > V0=SGMatrix< float64_t >(NULL, 0, 0, false), double eps=1e-12, int itermax=200)
all of classes and functions are contained in the shogun namespace
static SGMatrix< T > create_identity_matrix(index_t size, T scale)