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

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

adding some typedefs in Container2Ds - refs #448

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 KB
Line 
1#ifndef _theplu_yat_utility_matrix_weighted_
2#define _theplu_yat_utility_matrix_weighted_
3
4// $Id: MatrixWeighted.h 1549 2008-10-06 11:49:03Z 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
12  This file is part of the yat library, http://dev.thep.lu.se/yat
13
14  The yat library is free software; you can redistribute it and/or
15  modify it under the terms of the GNU General Public License as
16  published by the Free Software Foundation; either version 3 of the
17  License, or (at your option) any later version.
18
19  The yat library is distributed in the hope that it will be useful,
20  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  General Public License for more details.
23
24  You should have received a copy of the GNU General Public License
25  along with yat. If not, see <http://www.gnu.org/licenses/>.
26*/
27
28#include "DataWeight.h"
29#include "StrideIterator.h"
30
31#include <vector>
32
33namespace theplu {
34namespace yat {
35namespace utility {
36
37  class Matrix;
38
39  ///
40  /// @brief Weighted Matrix
41  ///
42  class MatrixWeighted
43  {
44  public:
45    /**
46       value_type is DataWeight
47
48       \since New in yat 0.5
49     */
50    typedef DataWeight value_type;
51
52    /**
53       reference type is DataWeight&
54     */
55    typedef DataWeight& reference;
56
57    /**
58       const_reference type is const DataWeight&
59     */
60    typedef const DataWeight& const_reference;
61
62    /**
63       Mutable iterator that iterates over all elements
64     */
65    typedef StrideIterator<std::vector<DataWeight>::iterator> iterator;
66
67    /**
68       Read-only iterator that iterates over all elements
69     */
70    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
71    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 StrideIterator<std::vector<DataWeight>::iterator> row_iterator;
88
89    /**
90       Read-only iterator that iterates over one row
91     */
92    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
93    const_row_iterator;
94
95    /**
96       @brief The default constructor.
97   
98       This contructor does not initialize underlying (essential)
99       structures.
100    */
101    MatrixWeighted(void);
102
103    /**
104       \brief 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 The istream constructor.
119
120       Data is copied from \a other and weights are calculated using
121       the nan function.
122    */
123    explicit MatrixWeighted(const Matrix& other);
124
125    /**
126       \brief The istream constructor.
127
128       This constructor first creates a Matrix using the istream
129       constructor, and then constructs MatrixWeighted using
130       MatrixWeighted(const Matrix&).
131    */
132    explicit MatrixWeighted(std::istream &, char sep='\0'); 
133
134    /**
135       Iterator iterates along a row. When end of row is reached it
136       jumps to beginning of next row.
137
138       \return iterator pointing to upper-left element.
139     */
140    iterator begin(void);
141
142    /**
143       Iterator iterates along a row. When end of row is reached it
144       jumps to beginning of next row.
145
146       \return const_iterator pointing to upper-left element.
147     */
148    const_iterator begin(void) const;
149
150    /**
151       Iterator iterates along a column.
152
153       \return iterator pointing to first element of column \a i.
154     */
155    iterator begin_column(size_t i);
156
157    /**
158       Iterator iterates along a column.
159
160       \return const_iterator pointing to first element of column \a i.
161     */
162    const_iterator begin_column(size_t i) const;
163
164    /**
165       Iterator iterates along a row.
166
167       \return iterator pointing to first element of row \a i.
168     */
169    iterator begin_row(size_t i);
170
171    /**
172       Iterator iterates along a row.
173
174       \return const_iterator pointing to first element of row \a i.
175     */
176    const_iterator begin_row(size_t i) const;
177
178    /**
179       \return The number of columns in the matrix.
180    */
181    size_t columns(void) const;
182
183    /**
184       \return iterator pointing to end of matrix
185     */
186    iterator end(void);
187
188    /**
189       \return const_iterator pointing to end of matrix
190     */
191    const_iterator end(void) const;
192
193    /**
194       \return iterator pointing to end of column \a i
195     */
196    iterator end_column(size_t i);
197
198    /**
199       \return const_iterator pointing to end of column \a i
200     */
201    const_iterator end_column(size_t i) const;
202
203    /**
204       \return iterator pointing to end of row \a i
205     */
206    iterator end_row(size_t i);
207
208    /**
209       \return const_iterator pointing to end of row \a i
210     */
211    const_iterator end_row(size_t i) const;
212
213    /**
214       \brief Resize Matrix
215
216       \note this function may invalidate iterators.
217    */
218    void resize(size_t, size_t);
219
220    /**
221       \return The number of rows in the matrix.
222    */
223    size_t rows(void) const;
224
225    /**
226       \brief Element access operator.
227
228       \return Reference to the element position (\a row, \a column).
229    */
230    DataWeight& operator()(size_t row,size_t column);
231
232    /**
233       \brief Element access operator.
234
235       \return Const reference to the element position (\a row, \a
236       column).
237    */
238    const DataWeight& operator()(size_t row,size_t column) const;
239
240
241    /**
242       \brief The assignment operator.
243
244       \return A const reference to the resulting Matrix.
245    */
246    const MatrixWeighted& operator=(const MatrixWeighted& other);
247
248  private:
249    void copy(const Matrix&);
250    void copy(const Matrix& data, const Matrix& weight);
251
252    std::vector<DataWeight> vec_;
253    size_t columns_;
254
255  };
256
257  /**
258     \brief Exchange all elements.
259
260     Takes constant time.
261
262     \throw std::runtime_error if the two matrices disagree in size.
263  */
264  void swap(MatrixWeighted&, MatrixWeighted&);
265
266}}} // of namespace utility, yat, and theplu
267
268#endif
Note: See TracBrowser for help on using the repository browser.