source: trunk/yat/classifier/MatrixLookup.cc @ 1063

Last change on this file since 1063 was 1063, checked in by Peter, 14 years ago

Iterators for MatrixLookup?

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 6.2 KB
Line 
1// $Id$
2
3/*
4  Copyright (C) 2005 Markus Ringnér, Peter Johansson
5  Copyright (C) 2006 Jari Häkkinen, Markus Ringnér, Peter Johansson
6  Copyright (C) 2007 Peter Johansson
7
8  This file is part of the yat library, http://trac.thep.lu.se/yat
9
10  The yat library is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License as
12  published by the Free Software Foundation; either version 2 of the
13  License, or (at your option) any later version.
14
15  The yat library is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23  02111-1307, USA.
24*/
25
26#include "MatrixLookup.h"
27#include "yat/utility/matrix.h"
28
29#include <algorithm>
30#include <cassert>
31#include <fstream>
32
33namespace theplu {
34namespace yat {
35namespace classifier {
36
37  MatrixLookup::MatrixLookup(const utility::matrix& data, const bool own)
38    : DataLookup2D(own), data_(&data)
39  {
40    row_index_.reserve(data_->rows());
41    for(size_t i=0;i<(*data_).rows();i++)
42      row_index_.push_back(i);
43    column_index_.reserve(data_->columns());
44    for(size_t i=0;i<(*data_).columns();i++)
45      column_index_.push_back(i);
46  }
47 
48
49
50  MatrixLookup::MatrixLookup(const utility::matrix& data, 
51                             const std::vector<size_t>& row, 
52                             const std::vector<size_t>& col)
53    : DataLookup2D(row,col), data_(&data)
54  {
55    // Checking that each row index is less than data.rows()
56    assert(row.empty() || 
57           *(std::max_element(row.begin(),row.end()))<data.rows());
58    // Checking that each column index is less than data.column()
59    assert(col.empty() || 
60           *(std::max_element(col.begin(),col.end()))<data.columns());
61  }
62 
63
64
65  MatrixLookup::MatrixLookup(const utility::matrix& data, 
66                             const std::vector<size_t>& index, 
67                             const bool row)
68    : DataLookup2D(), data_(&data)
69  {
70    if (row){
71      // Checking that each row index is less than data.rows()
72      assert(index.empty() || 
73             *(std::max_element(index.begin(),index.end()))<data.rows());
74      row_index_=index;
75      assert(column_index_.empty());
76      column_index_.reserve(data.columns());
77      for (size_t i=0; i<data.columns(); i++)
78        column_index_.push_back(i);
79    }
80    else{
81      // Checking that each column index is less than data.column()
82      assert(index.empty() || 
83             *(std::max_element(index.begin(),index.end()))<data.columns());
84      column_index_=index;
85      assert(row_index_.empty());
86      column_index_.reserve(data.rows());
87      for (size_t i=0; i<data.rows(); i++)
88        row_index_.push_back(i);
89    }
90  }
91 
92
93
94  MatrixLookup::MatrixLookup(const MatrixLookup& other)
95    : DataLookup2D(other), data_(other.data_)
96  {
97    ref_count_=other.ref_count_;
98    if (ref_count_)
99      ++(*ref_count_);
100  }
101
102
103
104  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
105                             const std::vector<size_t>& row, 
106                             const std::vector<size_t>& col)
107    : DataLookup2D(other,row,col), data_(other.data_)
108  {
109    ref_count_=other.ref_count_;
110    if (ref_count_)
111      ++(*ref_count_);
112  }
113 
114
115
116  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
117                             const std::vector<size_t>& index, bool row)
118    : DataLookup2D(other,index,row), data_(other.data_)
119  {
120    ref_count_=other.ref_count_;
121    if (ref_count_)
122      ++(*ref_count_);
123
124    // Checking that no index is out of range
125    assert(row_index_.empty() || 
126           *(max_element(row_index_.begin(), row_index_.end()))<data_->rows());
127    assert(column_index_.empty() || 
128           *(max_element(column_index_.begin(), column_index_.end()))<
129           data_->columns());
130  }
131 
132
133
134  MatrixLookup::MatrixLookup(const size_t rows, const size_t columns, 
135                             const double value)
136    : DataLookup2D(rows,columns) 
137  {
138    data_ = new utility::matrix(1,1,value);
139    ref_count_= new u_int(1);
140  }
141
142
143  MatrixLookup::MatrixLookup(std::istream& is, char sep)
144    : DataLookup2D()
145  {
146    data_ = new utility::matrix(is,sep);
147    ref_count_= new u_int(1);
148    for(size_t i=0;i<(*data_).rows();i++)
149      row_index_.push_back(i);
150    for(size_t i=0;i<(*data_).columns();i++)
151      column_index_.push_back(i);
152  }
153
154
155  MatrixLookup::~MatrixLookup(void)
156  {
157    if (ref_count_)
158      if (!--(*ref_count_))
159        delete data_;
160  }
161
162
163  MatrixLookup::const_iterator MatrixLookup::begin(void) const
164  {
165    return const_iterator(normal_iter(*this, 0, 0), 1);
166  }
167
168
169  MatrixLookup::const_iterator MatrixLookup::begin_column(size_t i) const
170  {
171    return const_iterator(normal_iter(*this, 0, i),this->columns());
172  }
173
174
175  MatrixLookup::const_iterator MatrixLookup::begin_row(size_t i) const
176  {
177    return const_iterator(normal_iter(*this, i, 0), 1);
178  }
179
180
181  MatrixLookup::const_iterator MatrixLookup::end(void) const
182  {
183    return const_iterator(normal_iter(*this, this->rows(), 0), 1);
184  }
185
186
187  MatrixLookup::const_iterator MatrixLookup::end_column(size_t i) const
188  {
189    return const_iterator(normal_iter(*this, this->rows(), i), this->columns());
190  }
191
192
193  MatrixLookup::const_iterator MatrixLookup::end_row(size_t i) const
194  {
195    return const_iterator(normal_iter(*this, i+1, 0), 1);
196  }
197
198
199  const MatrixLookup* 
200  MatrixLookup::selected(const std::vector<size_t>& i) const
201  { 
202    return new MatrixLookup(*this,i, true); 
203  }
204
205
206
207  const MatrixLookup* 
208  MatrixLookup::training_data(const std::vector<size_t>& i) const
209  { 
210    return new MatrixLookup(*this,i, false); 
211  }
212
213
214
215  const MatrixLookup* 
216  MatrixLookup::validation_data(const std::vector<size_t>& train,
217                                const std::vector<size_t>& val) const
218  { 
219    return new MatrixLookup(*this,val, false); 
220  }
221
222
223
224  bool MatrixLookup::weighted(void) const 
225  {
226    return false;
227  }
228
229
230
231  double MatrixLookup::operator()(const size_t row, const size_t column) const
232  {
233    assert(row<rows());
234    assert(column<columns());
235    return (*data_)(row_index_[row], column_index_[column]);
236  }
237
238
239
240  const MatrixLookup& MatrixLookup::operator=(const MatrixLookup& other)
241  {
242    if (this!=&other){
243      if (ref_count_ && !--(*ref_count_))
244        delete data_;
245      DataLookup2D::operator=(other);
246      data_ = other.data_;
247      ref_count_=other.ref_count_;
248      if (ref_count_)
249        ++(*ref_count_);
250    }
251    return *this;
252  }
253
254
255
256
257}}} // of namespace classifier, yat, and theplu
Note: See TracBrowser for help on using the repository browser.