CEBL  2.1
EEGData.cpp
Go to the documentation of this file.
1 
10 #include "Exceptions.hpp"
11 #include "EEGData.hpp"
12 #include "cppR/cppR.hpp"
13 #include <sstream>
14 #include <iostream>
15 #include <boost/lexical_cast.hpp>
16 #include <boost/numeric/ublas/io.hpp>
17 using namespace std;
18 using namespace boost;
19 
20 //CONSTRUCTORS:
22 {
23 }
24 
25 EEGData::EEGData(const ublas::matrix<double> &data)
26 {
27  this->data = data;
28 }
30 {
31  this->data = data.data;
32 }
34 {
35 }
36 
37 
38 //binds two matrices together by adding new matrix after the last column of the old
39 void EEGData::append(const EEGData &new_data)
40 {
41  if(new_data.size1() <= 0 || new_data.size2() <= 0)
42  return;
43 
44  //int orig_size1 = this->data.size1();
45  int orig_size2 = this->data.size2();
46 
47  int new_size1 = new_data.size1();
48  int new_size2 = orig_size2 + new_data.size2();
49 
50  try
51  {
52  this->data.resize(new_size1, new_size2);
53  }
54  catch(...)
55  {
56  MatrixException ex("Error resizing eeg data matrix in order to append data.");
57  throw(ex);
58  }
59 
60  for(int row = 0; row < new_data.size1(); row++)
61  {
62  for(int col = 0; col< new_data.size2(); col++)
63  {
64  this->data(row, col+orig_size2) = new_data.data(row,col);
65  }
66  }
67 
68 }
69 
70 //remove all data from matrix
72 {
73  data.resize(0,0,false);
74 }
75 
76 /**********************************************
77  *Output
78  */
79 void EEGData::saveToFile(const char *filename,
80  std::ios_base::openmode mode) const
81 {
82  std::ofstream ofs;
83  ofs.open(filename, mode);
84  if(ofs.fail())
85  {
86  cerr << "Error opening file: " << filename << " for writing.\n";
87  return;
88  }
89  else
90  {
91  saveToFile(ofs);
92  }
93 }
94 
95 
96 void EEGData::saveToFile(ofstream &ofs) const
97 {
98  try
99  {
100  for(unsigned int row=0; row<data.size1();row++)
101  {
102  for(unsigned int col=0; col<data.size2(); col++)
103  {
104  ofs << data(row,col) << " ";
105  }
106  ofs << "\n";
107  }
108  }
109  catch(...)
110  {
111  cerr << "Error writing EEGData to file.\n";
112  }
113 }
114 
115 /**********************************************
116  *Input
117  */
118 void EEGData::loadFromFile(const char *filename)
119 {
120  ifstream ifs;
121  ifs.open(filename);
122  if(ifs.fail())
123  {
124  throw FileException("Failed to open eeg data file.");
125  }
126  else
127  {
128  loadFromFile(ifs);
129  }
130 }
131 
132 
133 void EEGData::loadFromFile(ifstream &ifs)
134 {
135  try
136  {
137  int row,col;
138  row = 0;col=0;
139  int max_col = 0;
140  data.resize(1,1);
141  //loop through file
142  while(!ifs.eof())
143  {
144  string line;
145  getline(ifs,line);
146  stringstream ssline(line);
147  col = 0;
148  while(!ssline.eof())
149  {
150  string value;
151  ssline >> value;
152  try {
153  double v = lexical_cast<double>(value);
154  if(data.size2() <= unsigned(col))
155  {
156  data.resize(data.size1(),data.size2()*2);
157  }
158  if(data.size1() <= unsigned(row))
159  {
160  data.resize(data.size1()*2,data.size2());
161  }
162  data(row,col) = v;
163  col++;
164  if(col > max_col)
165  max_col = col;
166  } catch(...)
167  {
168  continue;
169  }
170  }
171  row++;
172  }
173  //cout << "now resizing to " << (row-1) << ", " << (max_col) << "\n";
174  data.resize(row-1,max_col);
175  //cout << "Loaded: " << (*this) << "\n";
176  }
177  catch(...)
178  {
179  throw FileException("Failed to open eeg data file.");
180  }
181 }
182 
183 
184 //SELECTION METHODS
185 
187  EEGData *data2,
188  int amount, DataSelectionMethod selection) const
189 {
190 
191  int new_size2 = int(data.size2() * (double(amount)/100.0));
192  data1->data.resize(data.size1(),new_size2);
193  data2->data.resize(data.size1(),new_size2);
194 
195  if(selection == DATA_SELECT_START)
196  {
197  //selecting from start
198  //cout << "selecting from start\n";
199  cppR::submatrixAssign(data1->data,
200  0,data1->data.size1(),
201  0,new_size2-1,
202  data,
203  0,data.size1(),
204  0,new_size2-1);
205  cppR::submatrixAssign(data2->data,
206  0,data2->data.size1(),
207  0,new_size2-1,
208  data,
209  0,data.size1(),
210  new_size2,data.size2()-1);
211  }
212  else if(selection == DATA_SELECT_END)
213  {
214  //selecting from end
215  //cout << "selecting from end\n";
216  cppR::submatrixAssign(data2->data,
217  0,data2->data.size1(),
218  0,new_size2-1,
219  data,
220  0,data.size1(),
221  0,new_size2-1);
222  cppR::submatrixAssign(data1->data,
223  0,data1->data.size1(),
224  0,new_size2-1,
225  data,
226  0,data.size1(),
227  new_size2,data.size2()-1);
228  }
229  else if(selection == DATA_SELECT_MIDDLE)
230  {
231  //selecting from middle
232  //cout << "selecting from middle\n";
233  int start_middle, end_middle;
234  start_middle = int(.25 * data.size2());
235  end_middle = int(.75 * data.size2());
236  cppR::submatrixAssign(data2->data,
237  0,data2->data.size1(),
238  0,new_size2-1,
239  data,
240  0,data.size1(),
241  0,start_middle-1);
242  cppR::submatrixAssign(data1->data,
243  0,data1->data.size1(),
244  0,new_size2-1,
245  data,
246  0,data.size1(),
247  start_middle,end_middle-1);
248  cppR::submatrixAssign(data2->data,
249  0,data2->data.size1(),
250  0,new_size2-1,
251  data,
252  0,data.size1(),
253  end_middle,data.size2()-1);
254 
255  }
256  else
257  {
258  //selecting random samples
259 
260  }
261 
262 }
263 
264 //----------------------------------------------------------------------
265 //OPERATORS
266 
268 {
269  if(this != &d)
270  {
271  this->data = d.data;
272  }
273  return *this;
274 }
275 
277 {
278  std::cout << data;
279 }
280 
281 
282 /**********************************************
283  *Friends
284  */
285 EEGData operator+(const EEGData &d1, const EEGData &d2)
286 {
287  EEGData d3 = EEGData(d1);
288  d3.append(d2);
289  return d3;
290 }
291 
292 ostream & operator<<(ostream &os, const EEGData &d)
293 {
294  os << "EEGData: " << ublas::matrix<double>(d).size1()
295  << " features X " << ublas::matrix<double>(d).size2() << " samples";
296  return os;
297 }