MNE-CPP  0.1.9
A Framework for Electrophysiology
fiff_named_matrix.h
Go to the documentation of this file.
1 //=============================================================================================================
37 #ifndef FIFF_NAMED_MATRIX_H
38 #define FIFF_NAMED_MATRIX_H
39 
40 //=============================================================================================================
41 // INCLUDES
42 //=============================================================================================================
43 
44 #include "fiff_global.h"
45 #include "fiff_constants.h"
46 #include "fiff_types.h"
47 
48 //=============================================================================================================
49 // EIGEN INCLUDES
50 //=============================================================================================================
51 
52 #include <Eigen/Core>
53 
54 //=============================================================================================================
55 // QT INCLUDES
56 //=============================================================================================================
57 
58 #include <QStringList>
59 #include <QSharedData>
60 #include <QSharedDataPointer>
61 #include <QSharedPointer>
62 
63 //=============================================================================================================
64 // DEFINE NAMESPACE FIFFLIB
65 //=============================================================================================================
66 
67 namespace FIFFLIB
68 {
69 
70 //=============================================================================================================
76 class FIFFSHARED_EXPORT FiffNamedMatrix : public QSharedData
77 {
78 public:
79  typedef QSharedPointer<FiffNamedMatrix> SPtr;
80  typedef QSharedPointer<const FiffNamedMatrix> ConstSPtr;
81  typedef QSharedDataPointer<FiffNamedMatrix> SDPtr;
83  //=========================================================================================================
88 
89  //=========================================================================================================
99  explicit FiffNamedMatrix(fiff_int_t p_nrow,
100  fiff_int_t p_ncol,
101  const QStringList& p_row_names,
102  const QStringList& p_col_names,
103  const Eigen::MatrixXd& p_data);
104 
105  //=========================================================================================================
111  FiffNamedMatrix(const FiffNamedMatrix& p_FiffNamedMatrix);
112 
113  //=========================================================================================================
117  ~FiffNamedMatrix() = default;
118 
119  //=========================================================================================================
123  void clear();
124 
125  //=========================================================================================================
131  inline bool isEmpty() const;
132 
133  //ToDo return the transposed matrix instead of applying it to its members
134  //=========================================================================================================
140  void transpose_named_matrix();
141 
142 // //=========================================================================================================
143 // /**
144 // * Assignment Operator
145 // *
146 // * @return rhs named matrix which hould be assigned.
147 // */
148 // inline FiffNamedMatrix& operator=(const FiffNamedMatrix& rhs);
149 
150  //=========================================================================================================
159  friend std::ostream& operator<<(std::ostream& out, const FIFFLIB::FiffNamedMatrix &p_FiffNamedMatrix);
160 
168  friend bool operator==(const FiffNamedMatrix &a, const FiffNamedMatrix &b);
169 
170 public:
171  fiff_int_t nrow;
172  fiff_int_t ncol;
173  QStringList row_names;
174  QStringList col_names;
175  Eigen::MatrixXd data;
177 // ### OLD STRUCT ###
178 //typedef struct { /* Matrix specification with a channel list */
179 // int nrow; /* Number of rows */
180 // int ncol; /* Number of columns */
181 // char **rowlist; /* Name list for the rows (may be NULL) */
182 // char **collist; /* Name list for the columns (may be NULL) */
183 // float **data; /* The data itself (dense) */
184 //} *mneNamedMatrix,mneNamedMatrixRec;
185 };
186 
187 //=============================================================================================================
188 // INLINE DEFINITIONS
189 //=============================================================================================================
190 
191 //inline FiffNamedMatrix& FiffNamedMatrix::operator=(const FiffNamedMatrix& rhs)
192 //{
193 // // Check for self-assignment!
194 // if (this == &rhs)
195 // return *this;
196 // //Else
197 // nrow = rhs.nrow;
198 // ncol = rhs.ncol;
199 // row_names = rhs.row_names;
200 // col_names = rhs.col_names;
201 // data = rhs.data;
202 
203 // return *this;
204 //}
205 
206 inline bool FiffNamedMatrix::isEmpty() const
207 {
208  return !(this->data.size() > 0);
209 }
210 
211 //=============================================================================================================
212 
213 inline std::ostream& operator<<(std::ostream& out, const FIFFLIB::FiffNamedMatrix &p_FiffNamedMatrix)
214 {
215  bool t_bIsShort = true;
216  out << "#### Fiff Named Matrix ####\n";
217  out << "\tnrow: " << p_FiffNamedMatrix.nrow << std::endl;
218  out << "\tncol: " << p_FiffNamedMatrix.ncol << std::endl;
219 
220  Eigen::MatrixXd data;
222  out << "\trow_names " << p_FiffNamedMatrix.row_names.size() << ":\n\t";
223  if(t_bIsShort)
224  {
225  qint32 nchan = p_FiffNamedMatrix.row_names.size() > 6 ? 6 : p_FiffNamedMatrix.row_names.size();
226  for(qint32 i = 0; i < nchan/2; ++i)
227  out << p_FiffNamedMatrix.row_names[i].toUtf8().constData() << " ";
228  out << "... ";
229  for(qint32 i = p_FiffNamedMatrix.row_names.size() - nchan/2; i < p_FiffNamedMatrix.row_names.size(); ++i)
230  out << p_FiffNamedMatrix.row_names[i].toUtf8().constData() << " ";
231  out << std::endl;
232  }
233 
234  out << "\tcol_names " << p_FiffNamedMatrix.col_names.size() << ":\n\t";
235  if(t_bIsShort)
236  {
237  qint32 nchan = p_FiffNamedMatrix.col_names.size() > 6 ? 6 : p_FiffNamedMatrix.col_names.size();
238  for(qint32 i = 0; i < nchan/2; ++i)
239  out << p_FiffNamedMatrix.col_names[i].toUtf8().constData() << " ";
240  out << "... ";
241  for(qint32 i = p_FiffNamedMatrix.col_names.size() - nchan/2; i < p_FiffNamedMatrix.col_names.size(); ++i)
242  out << p_FiffNamedMatrix.col_names[i].toUtf8().constData() << " ";
243  out << std::endl;
244  }
245 
246  out << "\tdata " << p_FiffNamedMatrix.data.rows() << " x " << p_FiffNamedMatrix.data.cols() << ":\n\t";
247  if(t_bIsShort)
248  {
249  qint32 nrows = p_FiffNamedMatrix.data.rows() > 6 ? 6 : p_FiffNamedMatrix.data.rows();
250  qint32 ncols = p_FiffNamedMatrix.data.cols() > 6 ? 6 : p_FiffNamedMatrix.data.cols();
251  if(nrows == 1)
252  {
253  for(qint32 i = 0; i < nrows; ++i)
254  {
255  for(qint32 j = 0; j < ncols/2; ++j)
256  out << p_FiffNamedMatrix.data(i,j) << " ";
257  out << "... ";
258  for(qint32 j = p_FiffNamedMatrix.data.cols() - ncols/2; j < p_FiffNamedMatrix.data.cols(); ++j)
259  out << p_FiffNamedMatrix.data(i,j) << " ";
260  out << "\n\t";
261  }
262  }
263  else
264  {
265  for(qint32 i = 0; i < nrows/2; ++i)
266  {
267  for(qint32 j = 0; j < ncols/2; ++j)
268  out << p_FiffNamedMatrix.data(i,j) << " ";
269  out << "... ";
270  for(qint32 j = p_FiffNamedMatrix.data.cols() - ncols/2; j < p_FiffNamedMatrix.data.cols(); ++j)
271  out << p_FiffNamedMatrix.data(i,j) << " ";
272  out << "\n\t";
273  }
274  out << "...\n\t";
275  for(qint32 i = p_FiffNamedMatrix.data.rows()-nrows/2; i < p_FiffNamedMatrix.data.rows(); ++i)
276  {
277  for(qint32 j = 0; j < ncols/2; ++j)
278  out << p_FiffNamedMatrix.data(i,j) << " ";
279  out << "... ";
280  for(qint32 j = p_FiffNamedMatrix.data.cols() - ncols/2; j < p_FiffNamedMatrix.data.cols(); ++j)
281  out << p_FiffNamedMatrix.data(i,j) << " ";
282  out << "\n\t";
283  }
284  }
285  out << "\n";
286  }
287 
288  return out;
289 }
290 
291 //=============================================================================================================
292 
293 inline bool operator== (const FiffNamedMatrix &a, const FiffNamedMatrix &b)
294 {
295  return (a.nrow == b.nrow &&
296  a.ncol == b.ncol &&
297  a.row_names == b.row_names &&
298  a.col_names == b.col_names &&
299  a.data.isApprox(b.data, 0.0001));
300 }
301 } // NAMESPACE
302 
303 #endif // FIFF_SOLUTION_H
FIFFLIB::operator<<
std::ostream & operator<<(std::ostream &out, const FIFFLIB::FiffCov &p_FiffCov)
Definition: fiff_cov.h:237
FIFFLIB::FiffNamedMatrix::ConstSPtr
QSharedPointer< const FiffNamedMatrix > ConstSPtr
Definition: fiff_named_matrix.h:80
FIFFLIB::FiffNamedMatrix::col_names
QStringList col_names
Definition: fiff_named_matrix.h:174
FIFFLIB::FiffNamedMatrix::isEmpty
bool isEmpty() const
Definition: fiff_named_matrix.h:206
FIFFLIB::FiffNamedMatrix::SPtr
QSharedPointer< FiffNamedMatrix > SPtr
Definition: fiff_named_matrix.h:79
FIFFLIB::FiffNamedMatrix::SDPtr
QSharedDataPointer< FiffNamedMatrix > SDPtr
Definition: fiff_named_matrix.h:81
FIFFLIB::FiffNamedMatrix::row_names
QStringList row_names
Definition: fiff_named_matrix.h:173
FIFFLIB::FiffNamedMatrix::data
Eigen::MatrixXd data
Definition: fiff_named_matrix.h:175
fiff_constants.h
Fiff constants.
FIFFSHARED_EXPORT
#define FIFFSHARED_EXPORT
Definition: fiff_global.h:56
fiff_global.h
Fiff library export/import macros.
fiff_types.h
Definitions for describing the objects in a FIFF file.
FIFFLIB::FiffNamedMatrix
A named matrix.
Definition: fiff_named_matrix.h:76
FIFFLIB::FiffNamedMatrix::ncol
fiff_int_t ncol
Definition: fiff_named_matrix.h:172
FIFFLIB::FiffNamedMatrix::nrow
fiff_int_t nrow
Definition: fiff_named_matrix.h:171
FIFFLIB::operator==
bool operator==(const FiffCoordTransOld &a, const FiffCoordTransOld &b)
Definition: fiff_coord_trans_old.h:217