v2.0.0
Loading...
Searching...
No Matches
fiff_named_matrix.h
Go to the documentation of this file.
1//=============================================================================================================
26
27#ifndef FIFF_NAMED_MATRIX_H
28#define FIFF_NAMED_MATRIX_H
29
30//=============================================================================================================
31// INCLUDES
32//=============================================================================================================
33
34#include "fiff_global.h"
35#include "fiff_constants.h"
36#include "fiff_types.h"
37
38//=============================================================================================================
39// EIGEN INCLUDES
40//=============================================================================================================
41
42#include <Eigen/Core>
43
44//=============================================================================================================
45// QT INCLUDES
46//=============================================================================================================
47
48#include <QStringList>
49#include <QSharedData>
50#include <QSharedDataPointer>
51#include <QSharedPointer>
52#include <memory>
53
54//=============================================================================================================
55// DEFINE NAMESPACE FIFFLIB
56//=============================================================================================================
57
58namespace FIFFLIB
59{
60
61//=============================================================================================================
74class FIFFSHARED_EXPORT FiffNamedMatrix : public QSharedData
75{
76public:
77 using SPtr = QSharedPointer<FiffNamedMatrix>;
78 using ConstSPtr = QSharedPointer<const FiffNamedMatrix>;
79 using UPtr = std::unique_ptr<FiffNamedMatrix>;
80 using ConstUPtr = std::unique_ptr<const FiffNamedMatrix>;
81 using SDPtr = QSharedDataPointer<FiffNamedMatrix>;
82
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 //=========================================================================================================
139
140 // //=========================================================================================================
141 // /**
142 // * Assignment Operator
143 // *
144 // * @return rhs named matrix which hould be assigned.
145 // */
146 // inline FiffNamedMatrix& operator=(const FiffNamedMatrix& rhs);
147
148 //=========================================================================================================
157 friend std::ostream& operator<<(std::ostream& out, const FIFFLIB::FiffNamedMatrix& p_FiffNamedMatrix);
158
167 friend bool operator==(const FiffNamedMatrix& a, const FiffNamedMatrix& b);
168
169public:
172 QStringList row_names;
173 QStringList col_names;
174 Eigen::MatrixXd data;
175};
176
177//=============================================================================================================
178// INLINE DEFINITIONS
179//=============================================================================================================
180
181//inline FiffNamedMatrix& FiffNamedMatrix::operator=(const FiffNamedMatrix& rhs)
182//{
183// // Check for self-assignment!
184// if (this == &rhs)
185// return *this;
186// //Else
187// nrow = rhs.nrow;
188// ncol = rhs.ncol;
189// row_names = rhs.row_names;
190// col_names = rhs.col_names;
191// data = rhs.data;
192
193// return *this;
194//}
195
196inline bool FiffNamedMatrix::isEmpty() const
197{
198 return !(this->data.size() > 0);
199}
200
201//=============================================================================================================
202
203inline std::ostream& operator<<(std::ostream& out, const FIFFLIB::FiffNamedMatrix& p_FiffNamedMatrix)
204{
205 bool t_bIsShort = true;
206 out << "#### Fiff Named Matrix ####\n";
207 out << "\tnrow: " << p_FiffNamedMatrix.nrow << std::endl;
208 out << "\tncol: " << p_FiffNamedMatrix.ncol << std::endl;
209
210 Eigen::MatrixXd data;
211
212 out << "\trow_names " << p_FiffNamedMatrix.row_names.size() << ":\n\t";
213 if (t_bIsShort) {
214 qint32 nchan = p_FiffNamedMatrix.row_names.size() > 6 ? 6 : p_FiffNamedMatrix.row_names.size();
215 for (qint32 i = 0; i < nchan / 2; ++i)
216 out << p_FiffNamedMatrix.row_names[i].toUtf8().constData() << " ";
217 out << "... ";
218 for (qint32 i = p_FiffNamedMatrix.row_names.size() - nchan / 2; i < p_FiffNamedMatrix.row_names.size(); ++i)
219 out << p_FiffNamedMatrix.row_names[i].toUtf8().constData() << " ";
220 out << std::endl;
221 }
222
223 out << "\tcol_names " << p_FiffNamedMatrix.col_names.size() << ":\n\t";
224 if (t_bIsShort) {
225 qint32 nchan = p_FiffNamedMatrix.col_names.size() > 6 ? 6 : p_FiffNamedMatrix.col_names.size();
226 for (qint32 i = 0; i < nchan / 2; ++i)
227 out << p_FiffNamedMatrix.col_names[i].toUtf8().constData() << " ";
228 out << "... ";
229 for (qint32 i = p_FiffNamedMatrix.col_names.size() - nchan / 2; i < p_FiffNamedMatrix.col_names.size(); ++i)
230 out << p_FiffNamedMatrix.col_names[i].toUtf8().constData() << " ";
231 out << std::endl;
232 }
233
234 out << "\tdata " << p_FiffNamedMatrix.data.rows() << " x " << p_FiffNamedMatrix.data.cols() << ":\n\t";
235 if (t_bIsShort) {
236 qint32 nrows = p_FiffNamedMatrix.data.rows() > 6 ? 6 : p_FiffNamedMatrix.data.rows();
237 qint32 ncols = p_FiffNamedMatrix.data.cols() > 6 ? 6 : p_FiffNamedMatrix.data.cols();
238 if (nrows == 1) {
239 for (qint32 i = 0; i < nrows; ++i) {
240 for (qint32 j = 0; j < ncols / 2; ++j)
241 out << p_FiffNamedMatrix.data(i, j) << " ";
242 out << "... ";
243 for (qint32 j = p_FiffNamedMatrix.data.cols() - ncols / 2; j < p_FiffNamedMatrix.data.cols(); ++j)
244 out << p_FiffNamedMatrix.data(i, j) << " ";
245 out << "\n\t";
246 }
247 } else {
248 for (qint32 i = 0; i < nrows / 2; ++i) {
249 for (qint32 j = 0; j < ncols / 2; ++j)
250 out << p_FiffNamedMatrix.data(i, j) << " ";
251 out << "... ";
252 for (qint32 j = p_FiffNamedMatrix.data.cols() - ncols / 2; j < p_FiffNamedMatrix.data.cols(); ++j)
253 out << p_FiffNamedMatrix.data(i, j) << " ";
254 out << "\n\t";
255 }
256 out << "...\n\t";
257 for (qint32 i = p_FiffNamedMatrix.data.rows() - nrows / 2; i < p_FiffNamedMatrix.data.rows(); ++i) {
258 for (qint32 j = 0; j < ncols / 2; ++j)
259 out << p_FiffNamedMatrix.data(i, j) << " ";
260 out << "... ";
261 for (qint32 j = p_FiffNamedMatrix.data.cols() - ncols / 2; j < p_FiffNamedMatrix.data.cols(); ++j)
262 out << p_FiffNamedMatrix.data(i, j) << " ";
263 out << "\n\t";
264 }
265 }
266 out << "\n";
267 }
268
269 return out;
270}
271
272//=============================================================================================================
273
274inline bool operator==(const FiffNamedMatrix& a, const FiffNamedMatrix& b)
275{
276 return (a.nrow == b.nrow &&
277 a.ncol == b.ncol &&
278 a.row_names == b.row_names &&
279 a.col_names == b.col_names &&
280 a.data.isApprox(b.data, 0.0001));
281}
282} // NAMESPACE
283
284#endif // FIFF_NAMED_MATRIX_H
Symbolic FIFF tag, block, value, unit and channel-type constants shared across FIFFLIB.
Export/import macros and build-info accessors for the FIFFLIB shared library.
#define FIFFSHARED_EXPORT
Definition fiff_global.h:44
Primitive scalar typedefs and forward-compatible aliases backing the FIFF type system.
FIFF file I/O, in-memory data structures and high-level readers/writers.
std::ostream & operator<<(std::ostream &out, const FIFFLIB::FiffCov &p_FiffCov)
Definition fiff_cov.h:272
qint32 fiff_int_t
Definition fiff_types.h:86
bool operator==(const FiffChInfo &a, const FiffChInfo &b)
FIFF named matrix: dense / sparse Eigen matrix plus row-name and column-name string lists.
std::unique_ptr< FiffNamedMatrix > UPtr
std::unique_ptr< const FiffNamedMatrix > ConstUPtr
FiffNamedMatrix(fiff_int_t p_nrow, fiff_int_t p_ncol, const QStringList &p_row_names, const QStringList &p_col_names, const Eigen::MatrixXd &p_data)
friend std::ostream & operator<<(std::ostream &out, const FIFFLIB::FiffNamedMatrix &p_FiffNamedMatrix)
QSharedPointer< FiffNamedMatrix > SPtr
QSharedDataPointer< FiffNamedMatrix > SDPtr
QSharedPointer< const FiffNamedMatrix > ConstSPtr
friend bool operator==(const FiffNamedMatrix &a, const FiffNamedMatrix &b)