source: trunk/yat/utility/MatrixWeighted.h @ 1887

Last change on this file since 1887 was 1887, checked in by Peter, 12 years ago

closes #512. added relates tag in namespace utility.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1#ifndef _theplu_yat_utility_matrix_weighted_
2#define _theplu_yat_utility_matrix_weighted_
3
4// $Id: MatrixWeighted.h 1887 2009-03-31 17:38:16Z peter $
5
6/*
7  Copyright (C) 2003 Daniel Dalevi, Peter Johansson
8  Copyright (C) 2004 Jari Häkkinen, Peter Johansson
9  Copyright (C) 2005, 2006 Jari Häkkinen, Peter Johansson, Markus Ringnér
10  Copyright (C) 2007, 2008 Jari Häkkinen, Peter Johansson
11  Copyright (C) 2009 Peter Johansson
12
13  This file is part of the yat library, http://dev.thep.lu.se/yat
14
15  The yat library is free software; you can redistribute it and/or
16  modify it under the terms of the GNU General Public License as
17  published by the Free Software Foundation; either version 3 of the
18  License, or (at your option) any later version.
19
20  The yat library is distributed in the hope that it will be useful,
21  but WITHOUT ANY WARRANTY; without even the implied warranty of
22  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23  General Public License for more details.
24
25  You should have received a copy of the GNU General Public License
26  along with yat. If not, see <http://www.gnu.org/licenses/>.
27*/
28
29#include "DataWeight.h"
30#include "StrideIterator.h"
31
32#include <vector>
33
34namespace theplu {
35namespace yat {
36namespace utility {
37
38  class Matrix;
39
40  /**
41     \brief Weighted Matrix
42
43     \since New in yat 0.5
44  */
45  class MatrixWeighted
46  {
47  public:
48    /**
49       value_type is DataWeight
50     */
51    typedef DataWeight value_type;
52
53    /**
54       reference type is DataWeight&
55     */
56    typedef DataWeight& reference;
57
58    /**
59       const_reference type is const DataWeight&
60     */
61    typedef const DataWeight& const_reference;
62
63    /**
64       Mutable iterator that iterates over all elements
65     */
66    typedef std::vector<DataWeight>::iterator iterator;
67
68    /**
69       Read-only iterator that iterates over all elements
70     */
71    typedef std::vector<DataWeight>::const_iterator const_iterator;
72
73    /**
74       Mutable iterator that iterates over one column
75     */
76    typedef StrideIterator<std::vector<DataWeight>::iterator> column_iterator;
77
78    /**
79       Read-only iterator that iterates over one column
80     */
81    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
82    const_column_iterator;
83
84    /**
85       Mutable iterator that iterates over one row
86     */
87    typedef column_iterator row_iterator;
88
89    /**
90       Read-only iterator that iterates over one row
91     */
92    typedef const_column_iterator const_row_iterator;
93
94    /**
95       @brief The default constructor.
96   
97       Creates a zero size MatrixWeighted
98    */
99    MatrixWeighted(void);
100
101    /**
102       \brief Create a \a r times \a c MatrixWeighted
103
104       Constructor allocating memory space for \a r times \a c
105       elements, and sets all elements to
106       DataWeight(\a init_value, \a init_weight)
107    */
108    MatrixWeighted(size_t r, size_t c, double init_value=0,
109                   double init_weight=1.0);
110
111    /**
112       \brief The copy constructor.
113    */
114    MatrixWeighted(const MatrixWeighted&);
115
116   
117    /**
118       \brief Constructor.
119
120       Data is copied from \a other and weights are calculated using
121       the binary_weight function, i.e., a NaN gets a zero weight and
122       other data values results in a unity weight (1.0).
123    */
124    explicit MatrixWeighted(const Matrix& other);
125
126    /**
127       \brief The istream constructor.
128
129       This constructor first creates a Matrix using the istream
130       constructor, and then constructs MatrixWeighted using
131       MatrixWeighted(const Matrix&).
132
133       \see Matrix(std::istream &, char)
134    */
135    explicit MatrixWeighted(std::istream &, char sep='\0'); 
136
137    /**
138       Iterator iterates along a row. When end of row is reached it
139       jumps to beginning of next row.
140
141       \return iterator pointing to upper-left element.
142     */
143    iterator begin(void);
144
145    /**
146       Iterator iterates along a row. When end of row is reached it
147       jumps to beginning of next row.
148
149       \return const_iterator pointing to upper-left element.
150     */
151    const_iterator begin(void) const;
152
153    /**
154       Iterator iterates along a column.
155
156       \return iterator pointing to first element of column \a i.
157     */
158    column_iterator begin_column(size_t i);
159
160    /**
161       Iterator iterates along a column.
162
163       \return const_iterator pointing to first element of column \a i.
164     */
165    const_column_iterator begin_column(size_t i) const;
166
167    /**
168       Iterator iterates along a row.
169
170       \return iterator pointing to first element of row \a i.
171     */
172    row_iterator begin_row(size_t i);
173
174    /**
175       Iterator iterates along a row.
176
177       \return const_iterator pointing to first element of row \a i.
178     */
179    const_row_iterator begin_row(size_t i) const;
180
181    /**
182       \return The number of columns in the matrix.
183    */
184    size_t columns(void) const;
185
186    /**
187       \return iterator pointing to end of matrix
188     */
189    iterator end(void);
190
191    /**
192       \return const_iterator pointing to end of matrix
193     */
194    const_iterator end(void) const;
195
196    /**
197       \return iterator pointing to end of column \a i
198     */
199    column_iterator end_column(size_t i);
200
201    /**
202       \return const_iterator pointing to end of column \a i
203     */
204    const_column_iterator end_column(size_t i) const;
205
206    /**
207       \return iterator pointing to end of row \a i
208     */
209    row_iterator end_row(size_t i);
210
211    /**
212       \return const_iterator pointing to end of row \a i
213     */
214    const_row_iterator end_row(size_t i) const;
215
216    /**
217       \brief Resize MatrixWeighted
218
219       Elements in MatrixWeighted are undefined after a resize.
220
221       \note this function may invalidate iterators.
222    */
223    void resize(size_t rows, size_t columns);
224
225    /**
226       \return The number of rows in the matrix.
227    */
228    size_t rows(void) const;
229
230    /**
231       \brief swap objects
232
233       Takes constant time. Invalidates iterators.
234       There is no requirement on the size of \a other.
235     */
236    void swap(MatrixWeighted& other);
237
238    /**
239       \brief Element access operator.
240
241       \return Reference to the element position (\a row, \a column).
242    */
243    DataWeight& operator()(size_t row,size_t column);
244
245    /**
246       \brief Element access operator.
247
248       \return Const reference to the element position (\a row, \a
249       column).
250    */
251    const DataWeight& operator()(size_t row,size_t column) const;
252
253
254    /**
255       \brief The assignment operator.
256
257       \return A const reference to the resulting Matrix.
258    */
259    const MatrixWeighted& operator=(const MatrixWeighted& other);
260
261  private:
262    void copy(const Matrix&);
263
264    std::vector<DataWeight> vec_;
265    size_t columns_;
266
267  };
268
269  /**
270     \brief Exchange all elements.
271
272     Takes constant time.
273
274     \see MatrixWeighted::swap(MatrixWeighted&)
275
276     \relates MatrixWeighted
277  */
278  void swap(MatrixWeighted&, MatrixWeighted&);
279
280}}} // of namespace utility, yat, and theplu
281
282#endif
Note: See TracBrowser for help on using the repository browser.