41 for (
int n=1;
n<N;
n++)
53 for (
int n=0;
n<N;
n++)
69 for (
int n=1;
n<N;
n++)
82 for (
int n=0;
n<N;
n++)
99 size_t NoInformation=0;
108 if (NoInformation==
XSIZE(stddev))
110 for (
int n=0;
n<N;
n++)
124 for (
int ii=0; ii<N; ii++)
127 const size_t unroll=4;
129 for (
int jj=0; jj<NPCA; jj++)
137 for (
size_t n=0; n<
nmax; n+=unroll, ptrii+=unroll, ptrjj+=unroll)
139 dotProduct += *ptrii * *ptrjj;
140 dotProduct += *(ptrii+1) * *(ptrjj+1);
141 dotProduct += *(ptrii+2) * *(ptrjj+2);
142 dotProduct += *(ptrii+3) * *(ptrjj+3);
146 dotProduct += *ptrii * *ptrjj;
159 for (
int ii=0; ii<N; ii++)
162 for (
int jj=0; jj<NPCA; jj++)
175 std::vector<size_t> used;
177 for (
size_t n=0;
n<NPCA;
n++)
182 }
while (
std::find(used.begin(),used.end(),nRandom)!=used.end());
185 used.push_back(nRandom);
189 for (
size_t n=0;
n<Niter;
n++)
194 for (
size_t ii=0; ii<NPCA; ii++)
197 for (
size_t jj=ii; jj<NPCA; jj++)
206 CtC(jj,ii)=CtC(ii,jj);
218 for (
size_t ii=0;ii<NPCA;ii++)
221 const size_t unroll=4;
224 for (
size_t jj=0; jj<N; jj++)
229 double val=
MAT_ELEM(XtXXtinv,jj,ii);
231 for (n=0; n<
nmax; n+=unroll, ptrPCA+=unroll, ptrI+=unroll)
233 *ptrPCA += *ptrI * val;
234 *(ptrPCA+1) += *(ptrI+1) * val;
235 *(ptrPCA+2) += *(ptrI+2) * val;
236 *(ptrPCA+3) += *(ptrI+3) * val;
240 *ptrPCA += *ptrI * val;
255 for (
size_t ii=0;ii<NPCA;ii++)
258 for (
size_t jj=0;jj<
v.size();jj++)
279 for (
size_t i=0;
i<xsize;
i++)
282 for (
size_t j=0;
j<NPCA;
j++)
283 for (
size_t k=0;
k<NPCA;
k++)
288 for (
size_t k=0;
k<NPCA;
k++)
296 for (
size_t ii=0;ii<NPCA;ii++)
318 for (
size_t ii=0;ii<
PCAbasis.size();ii++)
332 for (
size_t jj=0;jj<ii;jj++)
341 double inorm=1.0/
sqrt(orthonormalBasis.
sum2());
360 for (
int n=1;
n<N;
n++)
367 for (
int n=0;
n<N;
n++)
377 double iN_1=1.0/(N-1);
385 const char* fileName,
int numdesc)
404 std::cout <<
"Input vectors\n";
405 for (
int n=0;
n<N;
n++)
409 std::cout << std::endl;
417 std::cout <<
"\n\nInput vectors after normalization\n";
418 for (
int n=0;
n<N;
n++)
422 std::cout << std::endl;
429 std::ofstream fhOutPCA(fileName);
430 if (fhOutPCA.is_open())
432 for (
int n=0;
n<NPCA;
n++)
434 for (
int i=0;
i<numdesc;
i++)
436 fhOutPCA << std::endl;
440 else std::cerr <<
"Unable to open file " << fileName << std::endl;
446 std::ifstream fhOutPCA;
447 fhOutPCA.open(fileName);
448 if (fhOutPCA.is_open())
450 for (
int n=0;
n<NPCA;
n++)
452 for (
int i=0;
i<numdesc;
i++)
457 else std::cerr <<
"Unable to open file " << fileName << std::endl;
462 std::cout <<
"\n\nPCA basis\n";
463 for (
int n=0;
n<NPCA;
n++)
467 std::cout << std::endl;
477 std::cout <<
"\n\nPCA projected values\n" << proj << std::endl;
482 for (
int ii=0; ii<N; ii++)
484 for (
int i=0;
i<NPCA;
i++)
485 for (
int j=0;
j<NPCA;
j++)
491 std::cout <<
"\n\nCovariance matrix\n" << cov << std::endl;
496 for (
int ii=0; ii<N; ii++)
499 for (
int i=0;
i<NPCA;
i++)
502 for (
int j=0;
j<NPCA;
j++)
508 std::cout <<
"\n\nZscores\n";
511 std::cout << std::endl;
532 ycentered.resizeNoCopy(y);
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
PCAonline()
Empty constructor.
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
#define REPORT_ERROR(nerr, ErrormMsg)
void projectOnPCABasis(Matrix2D< double > &CtY)
Project on basis.
void addVector(MultidimArray< double > &y)
void sqrt(Image< double > &op)
double dotProduct(const MultidimArray< T > &op1)
std::vector< SelLine >::iterator find(std::vector< SelLine > &text, const std::string &img_name)
std::vector< MultidimArray< float > > v
void subtractAvg()
Subtract average.
#define MULTIDIM_ARRAY(v)
void inv(Matrix2D< T > &result) const
Matrix2D< T > transpose() const
T norm(const std::vector< T > &v)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v)
void computeStatistics(MultidimArray< double > &avg, MultidimArray< double > &stddev)
Compute Statistics.
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define MAT_ELEM(m, i, j)
void standardarizeVariables()
Standardarize variables.
#define DIRECT_A1D_ELEM(v, i)
MultidimArray< double > Zscore
void evaluateZScore(int NPCA, int Niter, bool trained=false, const char *filename="temp.txt", int numdesc=0)
#define XMIPP_EQUAL_ACCURACY
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
Error related to numerical calculation.
#define DIRECT_MULTIDIM_ELEM(v, n)
std::vector< MultidimArray< double > > PCAbasis
void svdcmp(const Matrix2D< T > &a, Matrix2D< double > &u, Matrix1D< double > &w, Matrix2D< double > &v)
void reconsFromPCA(const Matrix2D< double > &CtY, std::vector< MultidimArray< float > > &recons)
Reconstruct from PCA basis.
T dotProduct(const Matrix1D< T > &v1, const Matrix1D< T > &v2)
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
void learnPCABasis(size_t NPCA, size_t Niter)
Learn basis.
MultidimArray< double > avg
void initZeros(const MultidimArray< T1 > &op)
void indexSort(MultidimArray< int > &indx) const