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

Last change on this file since 604 was 604, checked in by Peter, 15 years ago

ref #96 Changed InputRanker? to return vector of index rather than element. Also added draft to FeatureSelection? class.

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