51 m_matrix.resize(0, 0);
52 m_precision.resize(0, 0);
53 m_correlation.resize(0, 0);
68 m_order = sqrt(covariance.size());
70 m_hartlap_factor = hartlap_factor(m_order, nmeasures);
73 m_precision = m_matrix.inverse();
74 m_determinant = m_matrix.determinant();
76 m_variance = m_matrix.diagonal();
77 m_std = m_variance.cwiseSqrt();
79 m_correlation = m_matrix.cwiseQuotient((m_std * m_std.transpose()));
142 size_t order = standard_deviation.size();
143 vector<double> matrix(order*order);
145 for (
size_t i=0; i<order; i++)
146 matrix[i*order+1] = pow(standard_deviation[i], 2);
148 m_set(matrix, nmeasures);
157 ifstream fin(filename.c_str());
checkIO(fin, filename);
160 for (
int i=0; i<skipped_lines; ++i) getline(fin, line);
162 vector<double> covariance;
164 while (getline(fin, line)) {
166 stringstream ss(line);
168 while (ss>>NN) num.push_back(NN);
171 covariance.push_back(num[cov_col]);
174 fin.clear(); fin.close();
176 m_set(covariance, nmeasures, prec);
186 string file_out = dir+file;
187 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
189 fout <<
"### [1] i # [2] j # [3] covariance # [4] correlation " << endl;
191 for (
size_t i=0; i<m_order; ++i)
192 for (
size_t j=0; j<m_order; ++j)
193 fout << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << i
194 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << j
195 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_matrix(i, j)
196 <<
" " << setiosflags(ios::fixed) << setprecision(precision) << setw(15) << right << m_correlation(i, j) << endl;
198 fout.close(); cout << endl;
coutCBL <<
"I wrote the file: " << file_out << endl;
207 const size_t nbins = dataset[0]->ndata();
208 const size_t nmocks = dataset.size();
210 vector<double> mean(nbins);
212 for (
size_t i=0; i<nbins; i++)
213 for (
size_t j=0; j<nmocks; j++)
214 mean[i] = dataset[j]->data(i)/nmocks;
216 double norm = normalization/(nmocks-1);
218 vector<double> covariance;
219 for (
size_t i=0; i<nbins; i++)
220 for (
size_t j=0; j<nbins; j++) {
222 for (
size_t n=0; n<nmocks; n++)
223 val += (dataset[n]->data(i)-mean[i])*(dataset[n]->data(j)-mean[j])*norm;
224 covariance.push_back(val);
227 m_set(covariance, nmocks, prec);
235 size_t nmocks = dataset[0].size();
238 for (
size_t i=0; i<dataset.size(); i++)
239 nbins += dataset[0][i]->ndata();
241 m_hartlap_factor = 1-(nbins+1)/(nmocks-1);
243 vector<vector<double>> table(nbins, vector<double>(nmocks, 0));
244 vector<double> mean(nbins);
247 for (
size_t i=0; i<dataset.size(); i++){
248 for (
size_t j=0; j<dataset[i].size(); j++) {
249 for (
int k=0; k<dataset[i][j]->ndata(); k++){
250 table[start+k][j] = dataset[i][j]->data(k);
251 mean[start+k] += dataset[i][j]->data(k)/nmocks;
254 start += dataset[i][0]->ndata();
257 double norm = normalization/(nmocks-1);
259 vector<double> covariance;
260 for (
size_t i=0; i<nbins; i++)
261 for (
size_t j=0; j<nbins; j++) {
263 for (
size_t n=0; n<nmocks; n++)
264 val += (table[i][n]-mean[i])*(table[j][n]-mean[j])*norm;
265 covariance.push_back(val);
268 m_set(covariance, nmocks, prec);
277 if (mask.size() != m_order)
278 ErrorCBL(
"size of the mask doesn't match covariance matrix order!",
"cut",
"CovarianceMatrix.cpp");
280 vector<double> matrix;
282 for (
size_t i=0; i<m_order; i++)
283 for (
size_t j=0; j<m_order; j++)
284 if (mask[i] and mask[j])
285 matrix.push_back(this->
operator()(i, j));
287 size_t size = sqrt(matrix.size());
298 const size_t new_size = m_order+covariance.
order();
299 vector<vector<double>> matrix(new_size, vector<double>(new_size, 0));
301 for (
size_t i=0; i<m_order; i++)
302 for (
size_t j=0; j<m_order; j++)
303 matrix[i][j] = m_matrix (i, j);
305 for (
size_t i=m_order; i<new_size; i++)
306 for (
size_t j=m_order; j<new_size; j++)
307 matrix[i][j] = covariance(i-m_order, j-m_order);
318 const size_t new_size = m_order+covariance->
order();
319 vector<vector<double>> matrix(new_size, vector<double>(new_size, 0));
321 for (
size_t i=0; i<m_order; i++)
322 for (
size_t j=0; j<m_order; j++)
323 matrix[i][j] = m_matrix (i, j);
325 for (
size_t i=m_order; i<new_size; i++)
326 for (
size_t j=m_order; j<new_size; j++)
327 matrix[i][j] = covariance->operator()(i-m_order, j-m_order);
338 size_t new_size = m_order;
340 for (
size_t i=0; i<covariance.size(); i++)
341 new_size += covariance[i].order();
343 vector<vector<double>> matrix(new_size, vector<double>(new_size, 0));
345 for (
size_t i=0; i<m_order; i++)
346 for (
size_t j=0; j<m_order; j++)
347 matrix[i][j] = this->
operator() (i, j);
349 size_t start = m_order;
350 size_t stop = m_order;
352 for (
size_t n=0; n<covariance.size(); n++) {
353 stop += covariance[n].order();
354 for (
size_t i=start; i<stop; i++)
355 for (
size_t j=start; j<stop; j++)
356 matrix[i][j] = covariance[n](i-start, j-start);
370 size_t new_size = m_order;
372 for (
size_t i=0; i<covariance.size(); i++)
373 new_size += covariance[i]->order();
375 vector<vector<double>> matrix(new_size, vector<double>(new_size, 0));
377 for (
size_t i=0; i<m_order; i++)
378 for (
size_t j=0; j<m_order; j++)
379 matrix[i][j] = this->
operator() (i, j);
381 size_t start = m_order;
382 size_t stop = m_order;
384 for (
size_t n=0; n<covariance.size(); n++) {
385 stop += covariance[n]->order();
386 for (
size_t i=start; i<stop; i++)
387 for (
size_t j=start; j<stop; j++)
388 matrix[i][j] = covariance[n]->
operator()(i-start, j-start);
The class CovarianceMatrix.
functions that wrap Eigen routines
#define coutCBL
CBL print message.
The class CovarianceMatrix.
std::vector< std::vector< double > > operator()() const
get the covariance matrix
void measure(const std::vector< std::shared_ptr< Data >> dataset, const double normalization=1, const double prec=1.e-10)
measure the covariance from a collection of dataset
std::vector< double > standard_deviation() const
get the standard deviation
void set_from_standard_deviation(const std::vector< double > standard_deviation, const double nmeasures=-1)
set the covariance by passing the diagonal square root
void read(const std::string filename, const int cov_col=2, const int skipped_lines=0, const double nmeasures=-1, const double prec=1.e-10)
set the covariance matrix, reading from an input file
std::vector< std::vector< double > > precision_hartlap() const
get the value of the precision matrix at index i,j times the Hartlap factor
std::vector< std::vector< double > > correlation() const
get the value of the correlation matrix at index i,j
std::vector< double > variance() const
get the variance
void m_set_default()
set internal attributes to default values
virtual void m_set(const std::vector< double > matrix, const double nmeasures=-1, const double prec=1.e-10)
set internal attributes
void write(const std::string dir, const std::string file, const int precision=4, const int rank=0) const
write the covariance matrix
std::vector< std::vector< double > > precision() const
get the precision matrix
size_t order() const
return the covariance matrix order
CovarianceMatrix cut(const std::vector< bool > mask) const
cut the data, for Data1D
CovarianceMatrix operator+=(const CovarianceMatrix covariance) const
overloading of the += operator, to sum two catalogues
static const double defaultDouble
default double value
std::vector< double > EigenToVector(const Eigen::MatrixXd vec)
convert an Eigen::MatrixXd to a std::vector<double>
Eigen::MatrixXd SquareMatrixToEigen(const std::vector< double > mat)
convert a std::vector<double> to an Eigen::MatrixXd object
std::vector< std::vector< double > > EigenToMatrix(const Eigen::MatrixXd mat)
convert an Eigen::MatrixXd to a std::vector<std::vector<double>>
The global namespace of the CosmoBolognaLib
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
std::vector< std::vector< T > > reshape(std::vector< T > vec, const int size1, const int size2)
reshape a vector into a matrix of given number of rows and columns