10 using namespace Eigen;
16 double eps,
int itermax)
22 for (
int i = 0; i < L; i++)
26 EigenSolver<MatrixXd> eig;
29 MatrixXd D = eig.pseudoEigenvalueMatrix();
31 for (
int j = 0; j < d; j++)
35 SG_SERROR(
"Input Matrix %d is not Positive-definite\n", i)
50 for (
int i = 0; i < L; i++)
53 ctot.block(0,i*d,d,d) = Ci;
60 std::vector<float64_t> crit;
61 while (decr > eps && iter < itermax)
77 crit.push_back(result);
94 int n2 = n*n, mn2 = m*n2,
95 i, ic, ii, ij, j, jc, jj, k, k0;
97 alpha, beta, gamma, a12, a21, det;
98 register float64_t tmp1, tmp2, tmp, weigh;
100 for (sumweigh = 0, i = 0; i < m; i++)
106 for (i = 1, ic = n; i < n ; i++, ic += n)
108 for (j = jc = 0; j < i; j++, jc += n)
114 for (q1 = p2 = p = q = 0, k0 = k = 0; k0 < m; k0++, k += n2)
122 q1 += weigh*tmp1/tmp2;
123 p2 += weigh*tmp2/tmp1;
136 if (fabs(alpha) - beta < 10e-20)
143 gamma = - (p*beta + alpha)/p2;
146 *decr += sumweigh*(p*p - alpha*alpha/beta)/p2;
152 if (fabs(gamma) - beta < 10e-20)
159 alpha = - (q*beta + gamma)/q1;
162 *decr += sumweigh*(q*q - gamma*gamma/beta)/q1;
165 tmp = (beta - sqrt(beta*beta - 4*alpha*gamma))/2;
169 for (k = 0; k < mn2; k += n2)
171 for (ii = i, jj = j; ii < ij; ii += n, jj += n)
174 c[ii+k] += a12*c[jj+k];
179 c[i+ic+k] += a12*(2*c[ij+k] + a12*c[jj+k]);
180 c[jj+k] += a21*c[ij+k];
183 for (; ii < ic; ii += n, jj++)
186 c[ii+k] += a12*c[jj+k];
190 for (; ++ii, ++jj < jc+n; )
193 c[ii+k] += a12*c[jj+k];
199 for (k = 0; k < n2; k += n)
202 a[i+k] += a12*a[j+k];
210 *logdet += 2*sumweigh*log(det);
212 for (tmp = 0, k0 = k = 0; k0 < m; k0++, k += n2)
214 for (det = 1, ii = 0; ii < n2; ii += n+1)
217 tmp += w[k0]*log(det);
221 *result = tmp - *logdet;
void jadiagw(float64_t c[], float64_t w[], int *ptn, int *ptm, float64_t a[], float64_t *logdet, float64_t *decr, float64_t *result)
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
all of classes and functions are contained in the shogun namespace
static SGMatrix< T > create_identity_matrix(index_t size, T scale)