10 using namespace Eigen;
15 double eps,
int itermax)
21 C_dims[0] = C0.
dims[0];
22 C_dims[1] = C0.
dims[1];
23 C_dims[2] = C0.
dims[2];
38 std::vector<float64_t> crit;
39 while (df > eps && inum < itermax)
48 int e =
CMath::ceil(log2(W.array().abs().rowwise().sum().maxCoeff()));
53 MatrixXd d = MatrixXd::Zero(EV.rows(),EV.cols());
54 d.diagonal() = VectorXd::Ones(EV.diagonalSize()).cwiseQuotient((EV * EV.transpose()).diagonal().cwiseSqrt());
57 for (
int i = 0; i < K; i++)
61 Ci = EV * C0i * EV.transpose();
65 for (
int i = 0; i < K; i++)
68 MatrixXd F = EV * C0i * EV.transpose();
69 f += (F.transpose() * F).diagonal().sum() - F.array().pow(2).matrix().diagonal().sum();
91 int auxij,auxji,auxii,auxjj;
98 for (
int i = 0; i < N; i++)
100 for (
int j = 0; j < N; j++)
102 for (
int k = 0; k < K; k++)
108 z(i, j) += C[auxii]*C[auxjj];
109 y(i, j) += 0.5*C[auxjj]*(C[auxij]+C[auxji]);
114 for (
int i = 0; i < N-1; i++)
116 for (
int j = i+1; j < N; j++)
120 W[auxij] = (z(j, i)*y(j, i) - z(i, i)*y(i, j))/(z(j, j)*z(i, i)-z(i, j)*z(i, j));
121 W[auxji] = (z(i, j)*y(i, j) - z(j, j)*y(j, i))/(z(j, j)*z(i, i)-z(i, j)*z(i, j));
T * get_matrix(index_t matIdx) const
static float64_t ceil(float64_t d)
static SGMatrix< float64_t > diagonalize(SGNDArray< float64_t > C, SGMatrix< float64_t > V0=SGMatrix< float64_t >(NULL, 0, 0, false), double eps=CMath::MACHINE_EPSILON, int itermax=200)
SGMatrix< T > clone() const
static SGMatrix< T > create_identity_matrix(index_t size, T scale)
void getW(float64_t *C, int *ptN, int *ptK, float64_t *W)
all of classes and functions are contained in the shogun namespace
T max(const Container< T > &a)