1 /*
2  * Implementations of the extended function for EIGEN lib
3  *
4  * 2014 by Jian Yang <jian.yang@uq.edu.au>
5  *
6  * This file is distributed under the GNU General Public
7  * License, Version 2.  Please see the file COPYING for more
8  * details
9  */
10 
11 #include "eigen_func.h"
12 
rank(VectorXf & x,VectorXf & rank)13 void eigen_func::rank(VectorXf &x, VectorXf &rank)
14 {
15     int size = x.size();
16     if(size < 1) return;
17 
18     int i = 0;
19     rank.resize(size);
20     vector<float> x_sort(size);
21     for(i = 0; i < size; i++) x_sort[i] = x[i];
22     stable_sort(x_sort.begin(), x_sort.end());
23     map<double, int> value_indx;
24     for(i = 0; i < size; i++) value_indx.insert(pair<double,int>(x_sort[i], i+1));
25     map<double, int>::iterator iter;
26     for(i = 0; i < size; i++){
27         iter = value_indx.find(x[i]);
28         rank[i] = iter->second;
29     }
30 }
31 
inverse_norm_rank_transform(VectorXf & x)32 void eigen_func::inverse_norm_rank_transform(VectorXf &x)
33 {
34     int size = x.size();
35     if(size < 1) return;
36 
37     VectorXf rank;
38     eigen_func::rank(x, rank);
39 
40     int i = 0;
41     float size_f = (float) size;
42     for(i = 0; i < size; i++) x[i] = StatFunc::qnorm((rank[i] - 0.5) / size_f);
43 }