6 #ifndef TAPKEE_LaplacianEigenmaps_H_
7 #define TAPKEE_LaplacianEigenmaps_H_
16 namespace tapkee_internal
38 template<
class RandomAccessIterator,
class DistanceCallback>
40 RandomAccessIterator end,
const Neighbors& neighbors,
47 sparse_triplets.reserve((k+1)*(end-begin));
50 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
57 ScalarType heat = exp(-distance*distance/width);
58 D(iter-begin) += heat;
59 D(current_neighbors[i]) += heat;
60 sparse_triplets.push_back(
SparseTriplet(current_neighbors[i],(iter-begin),-heat));
61 sparse_triplets.push_back(
SparseTriplet((iter-begin),current_neighbors[i],-heat));
64 for (
IndexType i=0; i<static_cast<IndexType>(end-begin); ++i)
67 #ifdef EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET
68 Eigen::DynamicSparseMatrix<ScalarType> dynamic_weight_matrix(end-begin,end-begin);
69 dynamic_weight_matrix.reserve(sparse_triplets.size());
70 for (SparseTriplets::const_iterator it=sparse_triplets.begin(); it!=sparse_triplets.end(); ++it)
71 dynamic_weight_matrix.coeffRef(it->col(),it->row()) += it->value();
75 weight_matrix.setFromTriplets(sparse_triplets.begin(),sparse_triplets.end());
81 template<
class RandomAccessIterator,
class FeatureVectorCallback>
83 DenseDiagonalMatrix& D, RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback feature_vector_callback,
93 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
95 feature_vector_callback.vector(*iter,rank_update_vector_i);
96 rhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i,D.diagonal()(iter-begin));
99 for (
int i=0; i<L.outerSize(); ++i)
101 for (SparseWeightMatrix::InnerIterator it(L,i); it; ++it)
103 feature_vector_callback.vector(begin[it.row()],rank_update_vector_i);
104 feature_vector_callback.vector(begin[it.col()],rank_update_vector_j);
105 lhs.selfadjointView<Eigen::Upper>().rankUpdate(rank_update_vector_i, rank_update_vector_j, it.value());