00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00030 #include "../Eigen/Dense"
00031
00032 using namespace Eigen;
00033
00034
00035
00048 void compute_pca3(double C[3][3], double vd[3], double PCs[3][3])
00049 {
00050 MatrixXd CC(3, 3);
00051 for (int i=0; i < 3; i++)
00052 for (int j=0; j < 3; j++)
00053 CC(i, j)=C[i][j];
00054
00055
00056
00057
00058 EigenSolver<MatrixXd> diag(CC);
00059 VectorXcd lambda = diag.eigenvalues();
00060 MatrixXcd P = diag.eigenvectors();
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 VectorXd real_lambda;
00076 real_lambda=lambda.array().real();
00077
00078 MatrixXd real_P(3, 3);
00079 real_P=P.array().real();
00080
00081 int position[3], pos;
00082 double ev[3], max;
00083
00084 for (int k=0; k < 3; k++) ev[k]=real_lambda(k);
00085 for (int k=0; k < 3; k++) {
00086 max=ev[0];
00087 pos=0;
00088 for (int j=1; j < 3; j++) {
00089 if (ev[j] > max) {
00090 max=ev[j];
00091 pos=j;
00092 }
00093 }
00094 position[k]=pos;
00095 ev[pos]=0;
00096 }
00097
00098 for (int k=0; k < 3; k++) {
00099 vd[k]=real_lambda(position[k]);
00100 PCs[0][k]=real_P(0, position[k]);
00101 PCs[1][k]=real_P(1, position[k]);
00102 PCs[2][k]=real_P(2, position[k]);
00103 }
00104
00105
00106 return;
00107 }
00108
00109