forked from pthimon/clustering
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEvrot.h
61 lines (50 loc) · 1.25 KB
/
Evrot.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
* evrot.h
*
* Class to compute the gradient of the eigenvectors
* alignment quality
*
* Lihi Zelnik (Caltech) March.2005
*
* Created on: 02-Mar-2009
* Author: sbutler
*
*/
#ifndef EVROT_H_
#define EVROT_H_
#include <iostream>
#include <vector>
#include <math.h>
#include <Eigen/Core>
#include <Eigen/Array>
#define DEBUG 0 // set to 1 to see print outs
#define EPS 2.2204e-16
class Evrot {
public:
Evrot(Eigen::MatrixXd& X, int method);
virtual ~Evrot();
double getQuality() { return mQuality; }
std::vector<std::vector<int> > getClusters() { return mClusters; }
Eigen::MatrixXd& getRotatedEigenVectors() { return mXrot; }
protected:
void evrot();
void cluster_assign();
double evqual(Eigen::MatrixXd& X);
double evqualitygrad(Eigen::VectorXd& theta, int angle_index);
Eigen::MatrixXd& rotate_givens(Eigen::VectorXd& theta);
Eigen::MatrixXd& build_Uab(Eigen::VectorXd& theta, int a, int b);
Eigen::MatrixXd& gradU(Eigen::VectorXd& theta, int k);
//constants
int mMethod;
const int mNumDims;
const int mNumData;
int mNumAngles;
Eigen::VectorXi ik;
Eigen::VectorXi jk;
//current iteration
Eigen::MatrixXd& mX;
Eigen::MatrixXd mXrot;
double mQuality;
std::vector<std::vector<int> > mClusters;
};
#endif /* EVROT_H_ */