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

Last change on this file since 1487 was 1487, checked in by Jari Häkkinen, 13 years ago

Addresses #436. GPL license copy reference should also be updated.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.8 KB
Line 
1#ifndef _theplu_yat_utility_matrix_weighted_
2#define _theplu_yat_utility_matrix_weighted_
3
4// $Id: MatrixWeighted.h 1487 2008-09-10 08:41:36Z jari $
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       Mutable iterator that iterates over all elements
47     */
48    typedef StrideIterator<std::vector<DataWeight>::iterator> iterator;
49
50    /**
51       Read-only iterator that iterates over all elements
52     */
53    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
54    const_iterator;
55
56    /**
57       Mutable iterator that iterates over one column
58     */
59    typedef StrideIterator<std::vector<DataWeight>::iterator> column_iterator;
60
61    /**
62       Read-only iterator that iterates over one column
63     */
64    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
65    const_column_iterator;
66
67    /**
68       Mutable iterator that iterates over one row
69     */
70    typedef StrideIterator<std::vector<DataWeight>::iterator> row_iterator;
71
72    /**
73       Read-only iterator that iterates over one row
74     */
75    typedef StrideIterator<std::vector<DataWeight>::const_iterator> 
76    const_row_iterator;
77
78    /**
79       @brief The default constructor.
80   
81       This contructor does not initialize underlying (essential)
82       structures.
83    */
84    MatrixWeighted(void);
85
86    /**
87       \brief Constructor allocating memory space for \a r times \a c
88       elements, and sets all elements to
89       DataWeight(\a init_value, \a init_weight)
90    */
91    MatrixWeighted(size_t r, size_t c, double init_value=0,
92                   double init_weight=1.0);
93
94    /**
95       \brief The copy constructor.
96    */
97    MatrixWeighted(const MatrixWeighted&);
98
99   
100    /**
101       \brief The istream constructor.
102
103       Data is copied from \a other and weights are calculated using
104       the nan function.
105    */
106    explicit MatrixWeighted(const Matrix& other);
107
108    /**
109       \brief The istream constructor.
110
111       This constructor first creates a Matrix using the istream
112       constructor, and then constructs MatrixWeighted using
113       MatrixWeighted(const Matrix&).
114    */
115    explicit MatrixWeighted(std::istream &, char sep='\0'); 
116
117    /**
118       Iterator iterates along a row. When end of row is reached it
119       jumps to beginning of next row.
120
121       \return iterator pointing to upper-left element.
122     */
123    iterator begin(void);
124
125    /**
126       Iterator iterates along a row. When end of row is reached it
127       jumps to beginning of next row.
128
129       \return const_iterator pointing to upper-left element.
130     */
131    const_iterator begin(void) const;
132
133    /**
134       Iterator iterates along a column.
135
136       \return iterator pointing to first element of column \a i.
137     */
138    iterator begin_column(size_t i);
139
140    /**
141       Iterator iterates along a column.
142
143       \return const_iterator pointing to first element of column \a i.
144     */
145    const_iterator begin_column(size_t i) const;
146
147    /**
148       Iterator iterates along a row.
149
150       \return iterator pointing to first element of row \a i.
151     */
152    iterator begin_row(size_t i);
153
154    /**
155       Iterator iterates along a row.
156
157       \return const_iterator pointing to first element of row \a i.
158     */
159    const_iterator begin_row(size_t i) const;
160
161    /**
162       \return The number of columns in the matrix.
163    */
164    size_t columns(void) const;
165
166    /**
167       \return iterator pointing to end of matrix
168     */
169    iterator end(void);
170
171    /**
172       \return const_iterator pointing to end of matrix
173     */
174    const_iterator end(void) const;
175
176    /**
177       \return iterator pointing to end of column \a i
178     */
179    iterator end_column(size_t i);
180
181    /**
182       \return const_iterator pointing to end of column \a i
183     */
184    const_iterator end_column(size_t i) const;
185
186    /**
187       \return iterator pointing to end of row \a i
188     */
189    iterator end_row(size_t i);
190
191    /**
192       \return const_iterator pointing to end of row \a i
193     */
194    const_iterator end_row(size_t i) const;
195
196    /**
197       \brief Resize Matrix
198
199       \note this function may invalidate iterators.
200    */
201    void resize(size_t, size_t);
202
203    /**
204       \return The number of rows in the matrix.
205    */
206    size_t rows(void) const;
207
208    /**
209       \brief Element access operator.
210
211       \return Reference to the element position (\a row, \a column).
212    */
213    DataWeight& operator()(size_t row,size_t column);
214
215    /**
216       \brief Element access operator.
217
218       \return Const reference to the element position (\a row, \a
219       column).
220    */
221    const DataWeight& operator()(size_t row,size_t column) const;
222
223
224    /**
225       \brief The assignment operator.
226
227       \return A const reference to the resulting Matrix.
228    */
229    const MatrixWeighted& operator=(const MatrixWeighted& other);
230
231  private:
232    void copy(const Matrix&);
233    void copy(const Matrix& data, const Matrix& weight);
234
235    std::vector<DataWeight> vec_;
236    size_t columns_;
237
238  };
239
240  /**
241     \brief Exchange all elements.
242
243     Takes constant time.
244
245     \throw std::runtime_error if the two matrices disagree in size.
246  */
247  void swap(MatrixWeighted&, MatrixWeighted&);
248
249}}} // of namespace utility, yat, and theplu
250
251#endif
Note: See TracBrowser for help on using the repository browser.