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;
95 for (
int i = 0; i < N; i++)
97 for (
int j = 0; j < N; j++)
104 for (
int i = 0; i < N; i++)
106 for (
int j = 0; j < N; j++)
108 for (
int k = 0; k < K; k++)
114 z[i][j] += C[auxii]*C[auxjj];
115 y[i][j] += 0.5*C[auxjj]*(C[auxij]+C[auxji]);
120 for (
int i = 0; i < N-1; i++)
122 for (
int j = i+1; j < N; j++)
126 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]);
127 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]);
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)
T * get_matrix(index_t matIdx) const
void getW(float64_t *C, int *ptN, int *ptK, float64_t *W)
all of classes and functions are contained in the shogun namespace
Matrix::Scalar max(Matrix m)
static SGMatrix< T > create_identity_matrix(index_t size, T scale)