source: trunk/yat/classifier/MatrixLookupWeighted.cc @ 1169

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

refs #343 moving data to inherited classes and using SmartPtr?.

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