22 using namespace shogun;
66 return "LaplacianEigenmaps";
98 CFibonacciHeap* heap =
new CFibonacciHeap(N);
105 heap->insert(j,W_matrix[i*N+j]);
108 heap->extract_min(tmp);
111 for (j=0; j<
m_k; j++)
112 W_matrix[i*N+heap->extract_min(tmp)] *= -1.0;
117 if (W_matrix[i*N+j]>0.0)
118 W_matrix[i*N+j] = 0.0;
120 W_matrix[i*N+j] *= -1.0;
134 if (W_matrix[i*N+j]!=0.0 || W_matrix[j*N+i]==0.0)
136 W_matrix[j*N+i] = W_matrix[i*N+j];
138 if (W_matrix[j*N+i]!=0.0 || W_matrix[i*N+j]==0.0)
140 W_matrix[i*N+j] = W_matrix[j*N+i];
143 if (W_matrix[i*N+j] != 0.0)
147 W_matrix[i*N+j] = tmp;
148 W_matrix[j*N+i] = tmp;
169 D_diag_vector[i] += W_matrix[i*N+j];
173 for (i=0; i<N*N; i++)
178 W_matrix[i*N+i] += D_diag_vector[i];
182 int eigenproblem_status = 0;
184 arpack_dsxupd(W_matrix.
matrix,D_diag_vector,
true,N,
m_target_dim+1,
"LA",
true,3,
false,
false,-1e-9,0.0,
185 eigenvalues_vector,W_matrix.
matrix,eigenproblem_status);
187 if (eigenproblem_status!=0)
188 SG_ERROR(
"DSXUPD failed with code %d\n",eigenproblem_status);
194 int eigenproblem_status = 0;
199 rhs[i*N+i] = D_diag_vector[i];
201 wrap_dsygvx(1,
'V',
'U',N,W_matrix.
matrix,N,rhs,N,1,
m_target_dim+2,eigenvalues_vector,W_matrix.
matrix,&eigenproblem_status);
203 if (eigenproblem_status)
204 SG_ERROR(
"DSYGVX failed with code: %d.\n",eigenproblem_status);
219 new_features[j*m_target_dim+i] = W_matrix[j*(m_target_dim+1)+i+1];
221 new_features[j*m_target_dim+i] = W_matrix[(i+1)*N+j];