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

Last change on this file since 1090 was 1066, checked in by Peter, 13 years ago

Iterators for KernelLookup? - refs #267

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 6.3 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(const_iterator::iterator_type(*this, 0, 0), 1);
166  }
167
168
169  MatrixLookup::const_iterator MatrixLookup::begin_column(size_t i) const
170  {
171    return const_iterator(const_iterator::iterator_type(*this, 0, i),columns());
172  }
173
174
175  MatrixLookup::const_iterator MatrixLookup::begin_row(size_t i) const
176  {
177    return const_iterator(const_iterator::iterator_type(*this, i, 0), 1);
178  }
179
180
181  MatrixLookup::const_iterator MatrixLookup::end(void) const
182  {
183    return const_iterator(const_iterator::iterator_type(*this, rows(), 0), 1);
184  }
185
186
187  MatrixLookup::const_iterator MatrixLookup::end_column(size_t i) const
188  {
189    return const_iterator(const_iterator::iterator_type(*this, rows(), i), 
190                          columns());
191  }
192
193
194  MatrixLookup::const_iterator MatrixLookup::end_row(size_t i) const
195  {
196    return const_iterator(const_iterator::iterator_type(*this, i+1, 0), 1);
197  }
198
199
200  const MatrixLookup* 
201  MatrixLookup::selected(const std::vector<size_t>& i) const
202  { 
203    return new MatrixLookup(*this,i, true); 
204  }
205
206
207
208  const MatrixLookup* 
209  MatrixLookup::training_data(const std::vector<size_t>& i) const
210  { 
211    return new MatrixLookup(*this,i, false); 
212  }
213
214
215
216  const MatrixLookup* 
217  MatrixLookup::validation_data(const std::vector<size_t>& train,
218                                const std::vector<size_t>& val) const
219  { 
220    return new MatrixLookup(*this,val, false); 
221  }
222
223
224
225  bool MatrixLookup::weighted(void) const 
226  {
227    return false;
228  }
229
230
231
232  double MatrixLookup::operator()(const size_t row, const size_t column) const
233  {
234    assert(row<rows());
235    assert(column<columns());
236    return (*data_)(row_index_[row], column_index_[column]);
237  }
238
239
240
241  const MatrixLookup& MatrixLookup::operator=(const MatrixLookup& other)
242  {
243    if (this!=&other){
244      if (ref_count_ && !--(*ref_count_))
245        delete data_;
246      DataLookup2D::operator=(other);
247      data_ = other.data_;
248      ref_count_=other.ref_count_;
249      if (ref_count_)
250        ++(*ref_count_);
251    }
252    return *this;
253  }
254
255
256
257
258}}} // of namespace classifier, yat, and theplu
Note: See TracBrowser for help on using the repository browser.