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

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

added function in KernelLookup? to create a KernelLookup? from inner data and outer (passed) data.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 4.5 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, const bool own)
17    : DataLookup2D(own), 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& other)
72    : DataLookup2D(other), data_(other.data_)
73  {
74    ref_count_=other.ref_count_;
75    if (ref_count_)
76      ++(*ref_count_);
77  }
78
79
80
81  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
82                             const std::vector<size_t>& row, 
83                             const std::vector<size_t>& col)
84    : DataLookup2D(other,row,col), data_(other.data_)
85  {
86    ref_count_=other.ref_count_;
87    if (ref_count_)
88      ++(*ref_count_);
89  }
90 
91
92
93  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
94                             const std::vector<size_t>& index, bool row)
95    : DataLookup2D(other,index,row), data_(other.data_)
96  {
97    ref_count_=other.ref_count_;
98    if (ref_count_)
99      ++(*ref_count_);
100
101    // Checking that no index is out of range
102    assert(row_index_.empty() || 
103           *(max_element(row_index_.begin(), row_index_.end()))<data_->rows());
104    assert(column_index_.empty() || 
105           *(max_element(column_index_.begin(), column_index_.end()))<
106           data_->columns());
107  }
108 
109
110
111  MatrixLookup::MatrixLookup(const size_t rows, const size_t columns, 
112                             const double value)
113    : DataLookup2D(rows,columns) 
114  {
115    data_ = new utility::matrix(1,1,value);
116    ref_count_= new u_int(1);
117  }
118
119
120  MatrixLookup::MatrixLookup(std::istream& is, char sep)
121    : DataLookup2D()
122  {
123    data_ = new utility::matrix(is,sep);
124    ref_count_= new u_int(1);
125    for(size_t i=0;i<(*data_).rows();i++)
126      row_index_.push_back(i);
127    for(size_t i=0;i<(*data_).columns();i++)
128      column_index_.push_back(i);
129  }
130
131
132  MatrixLookup::~MatrixLookup(void)
133  {
134    if (ref_count_)
135      if (!--(*ref_count_))
136        delete data_;
137  }
138
139
140  const MatrixLookup* 
141  MatrixLookup::selected(const std::vector<size_t>& i) const
142  { 
143    return new MatrixLookup(*this,i, true); 
144  }
145
146
147
148  const MatrixLookup* 
149  MatrixLookup::training_data(const std::vector<size_t>& i) const
150  { 
151    return new MatrixLookup(*this,i, false); 
152  }
153
154
155
156  const MatrixLookup* 
157  MatrixLookup::validation_data(const std::vector<size_t>& train,
158                                const std::vector<size_t>& val) const
159  { 
160    return new MatrixLookup(*this,val, false); 
161  }
162
163
164
165  bool MatrixLookup::weighted(void) const 
166  {
167    return false;
168  }
169
170
171
172  const MatrixLookup& MatrixLookup::operator=(const MatrixLookup& other)
173  {
174    if (this!=&other){
175      if (ref_count_ && !--(*ref_count_))
176        delete data_;
177      DataLookup2D::operator=(other);
178      data_ = other.data_;
179      ref_count_=other.ref_count_;
180      if (ref_count_)
181        ++(*ref_count_);
182    }
183    return *this;
184  }
185
186
187  std::ostream& operator<<(std::ostream& s, const MatrixLookup& m)
188  {
189    s.setf(std::ios::dec);
190    s.precision(12);
191    for(size_t i=0, j=0; i<m.rows(); i++)
192      for (j=0; j<m.columns(); j++) {
193        s << m(i,j);
194        if (j<m.columns()-1)
195          s << s.fill();
196        else if (i<m.rows()-1)
197          s << "\n";
198      }
199    return s;
200  }
201
202
203
204}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.