source: trunk/c++_tools/classifier/MatrixLookup.cc @ 631

Last change on this file since 631 was 631, checked in by Peter, 16 years ago

fixes #102 added weighted() to DataLookup2D.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 4.6 KB
Line 
1// $Id$
2
3#include <c++_tools/classifier/MatrixLookup.h>
4
5#include <c++_tools/utility/matrix.h>
6
7#ifndef NDEBUG
8#include <algorithm>
9#endif
10
11#include <fstream>
12
13namespace theplu {
14namespace classifier {
15
16  MatrixLookup::MatrixLookup(const utility::matrix& data)
17    : DataLookup2D(), data_(&data)
18  {
19    for(size_t i=0;i<(*data_).rows();i++)
20      row_index_.push_back(i);
21    for(size_t i=0;i<(*data_).columns();i++)
22      column_index_.push_back(i);
23  }
24 
25
26
27  MatrixLookup::MatrixLookup(const utility::matrix& data, 
28                             const std::vector<size_t>& row, 
29                             const std::vector<size_t>& col)
30    : DataLookup2D(row,col), data_(&data)
31  {
32    // Checking that each row index is less than data.rows()
33    assert(row.empty() || 
34           *(std::max_element(row.begin(),row.end()))<data.rows());
35    // Checking that each column index is less than data.column()
36    assert(col.empty() || 
37           *(std::max_element(col.begin(),col.end()))<data.columns());
38  }
39 
40
41
42  MatrixLookup::MatrixLookup(const utility::matrix& data, 
43                     const std::vector<size_t>& index, 
44                     const bool row)
45    : DataLookup2D(), data_(&data)
46  {
47    if (row){
48      // Checking that each row index is less than data.rows()
49      assert(index.empty() || 
50             *(std::max_element(index.begin(),index.end()))<data.rows());
51      row_index_=index;
52      assert(column_index_.empty());
53      column_index_.reserve(data.columns());
54      for (size_t i=0; i<data.columns(); i++)
55        column_index_.push_back(i);
56    }
57    else{
58      // Checking that each column index is less than data.column()
59      assert(index.empty() || 
60             *(std::max_element(index.begin(),index.end()))<data.columns());
61      column_index_=index;
62      assert(row_index_.empty());
63      column_index_.reserve(data.rows());
64      for (size_t i=0; i<data.rows(); i++)
65        row_index_.push_back(i);
66    }
67  }
68 
69
70
71  MatrixLookup::MatrixLookup(const MatrixLookup& dv)
72    : DataLookup2D(dv), data_(dv.data_)
73  {
74  }
75
76
77
78  MatrixLookup::MatrixLookup(const MatrixLookup& ml, 
79                             const std::vector<size_t>& row, 
80                             const std::vector<size_t>& col)
81    : DataLookup2D(ml,row,col), data_(ml.data_)
82  {
83  }
84 
85
86
87  MatrixLookup::MatrixLookup(const MatrixLookup& ml, 
88                             const std::vector<size_t>& index, bool row)
89    : DataLookup2D(ml,index,row), data_(ml.data_)
90  {
91    // Checking that no index is out of range
92    assert(row_index_.empty() || 
93           *(max_element(row_index_.begin(), row_index_.end()))<data_->rows());
94    assert(column_index_.empty() || 
95           *(max_element(column_index_.begin(), column_index_.end()))<
96           data_->columns());
97  }
98 
99
100
101  MatrixLookup::MatrixLookup(const size_t rows, const size_t columns, 
102                             const double value)
103    : DataLookup2D(rows,columns, true) 
104  {
105    data_ = new utility::matrix(1,1,value);
106  }
107
108
109  MatrixLookup::MatrixLookup(std::istream& is, char sep)
110    : DataLookup2D(true)
111  {
112    data_ = new utility::matrix(is,sep);
113    for(size_t i=0;i<(*data_).rows();i++)
114      row_index_.push_back(i);
115    for(size_t i=0;i<(*data_).columns();i++)
116      column_index_.push_back(i);
117  }
118
119
120  MatrixLookup::~MatrixLookup(void)
121  {
122    if (owner_)
123      delete data_;
124  }
125
126
127  const MatrixLookup* 
128  MatrixLookup::selected(const std::vector<size_t>& i) const
129  { 
130    return new MatrixLookup(*this,i, true); 
131  }
132
133
134
135  const MatrixLookup* 
136  MatrixLookup::training_data(const std::vector<size_t>& i) const
137  { 
138    return new MatrixLookup(*this,i, false); 
139  }
140
141
142
143  const MatrixLookup* 
144  MatrixLookup::training_data(const std::vector<size_t>& features,
145                              const std::vector<size_t>& samples) const
146  { 
147    return new MatrixLookup(*this, features, samples); 
148  }
149
150
151
152  const MatrixLookup* 
153  MatrixLookup::validation_data(const std::vector<size_t>& train,
154                                const std::vector<size_t>& val) const
155  { 
156    return new MatrixLookup(*this,val, false); 
157  }
158
159
160
161  const MatrixLookup* 
162  MatrixLookup::validation_data(const std::vector<size_t>& features,
163                                const std::vector<size_t>& train,
164                                const std::vector<size_t>& val) const
165  { 
166    return new MatrixLookup(*this,features, val); 
167  }
168
169
170
171  bool MatrixLookup::weighted(void) const 
172  {
173    return false;
174  }
175
176
177
178  const MatrixLookup& MatrixLookup::operator=(const MatrixLookup& other)
179  {
180    if (this!=&other){
181      if (owner_){
182        delete data_;
183        owner_=false;
184      }
185      DataLookup2D::operator=(other);
186      data_ = other.data_;
187    }
188    return *this;
189  }
190
191
192  std::ostream& operator<<(std::ostream& s, const MatrixLookup& m)
193  {
194    s.setf(std::ios::dec);
195    s.precision(12);
196    for(size_t i=0, j=0; i<m.rows(); i++)
197      for (j=0; j<m.columns(); j++) {
198        s << m(i,j);
199        if (j<m.columns()-1)
200          s << s.fill();
201        else if (i<m.rows()-1)
202          s << "\n";
203      }
204    return s;
205  }
206
207
208
209}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.