3190 |
30 Mar 14 |
peter |
1 |
#ifndef _theplu_yat_utility_kernel_matrix_ |
3190 |
30 Mar 14 |
peter |
2 |
#define _theplu_yat_utility_kernel_matrix_ |
3190 |
30 Mar 14 |
peter |
3 |
|
3190 |
30 Mar 14 |
peter |
// $Id$ |
3190 |
30 Mar 14 |
peter |
5 |
|
3190 |
30 Mar 14 |
peter |
6 |
/* |
3190 |
30 Mar 14 |
peter |
Copyright (C) 2014 Peter Johansson |
3190 |
30 Mar 14 |
peter |
8 |
|
3190 |
30 Mar 14 |
peter |
This file is part of the yat library, http://dev.thep.lu.se/yat |
3190 |
30 Mar 14 |
peter |
10 |
|
3190 |
30 Mar 14 |
peter |
The yat library is free software; you can redistribute it and/or |
3190 |
30 Mar 14 |
peter |
modify it under the terms of the GNU General Public License as |
3190 |
30 Mar 14 |
peter |
published by the Free Software Foundation; either version 3 of the |
3190 |
30 Mar 14 |
peter |
License, or (at your option) any later version. |
3190 |
30 Mar 14 |
peter |
15 |
|
3190 |
30 Mar 14 |
peter |
The yat library is distributed in the hope that it will be useful, |
3190 |
30 Mar 14 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
3190 |
30 Mar 14 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3190 |
30 Mar 14 |
peter |
General Public License for more details. |
3190 |
30 Mar 14 |
peter |
20 |
|
3190 |
30 Mar 14 |
peter |
You should have received a copy of the GNU General Public License |
3190 |
30 Mar 14 |
peter |
along with yat. If not, see <http://www.gnu.org/licenses/>. |
3190 |
30 Mar 14 |
peter |
23 |
*/ |
3190 |
30 Mar 14 |
peter |
24 |
|
3190 |
30 Mar 14 |
peter |
25 |
#include "Container2DIterator.h" |
3190 |
30 Mar 14 |
peter |
26 |
#include "StrideIterator.h" |
3190 |
30 Mar 14 |
peter |
27 |
|
3190 |
30 Mar 14 |
peter |
28 |
namespace theplu { |
3190 |
30 Mar 14 |
peter |
29 |
namespace yat { |
3190 |
30 Mar 14 |
peter |
30 |
namespace utility { |
3190 |
30 Mar 14 |
peter |
31 |
|
3190 |
30 Mar 14 |
peter |
32 |
/** |
3190 |
30 Mar 14 |
peter |
\brief A KernelMatrix is a \ref concept_container_2d |
3190 |
30 Mar 14 |
peter |
34 |
|
3190 |
30 Mar 14 |
peter |
A matrix-like object constructed from two |
3190 |
30 Mar 14 |
peter |
<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html"> |
3190 |
30 Mar 14 |
peter |
37 |
|
3190 |
30 Mar 14 |
peter |
RandomAccessContainer</a>s and Functor. Each row in the matrix |
3190 |
30 Mar 14 |
peter |
correspond to an element in the RandomAccessRange1 and each |
3190 |
30 Mar 14 |
peter |
column correspond to an element in RandomAccessRange2. Number of |
3190 |
30 Mar 14 |
peter |
rows in the matrix equals number of element in RandomAccessRange1 |
3190 |
30 Mar 14 |
peter |
and number of columns equals number of elements in |
3190 |
30 Mar 14 |
peter |
RandomAccessRange2. An element in row \a row and column \a column |
3190 |
30 Mar 14 |
peter |
is calculated by taking the element \a row in RandomAccessRange1 |
3190 |
30 Mar 14 |
peter |
and element \a column in RandomAccessRange2, and passing these |
3190 |
30 Mar 14 |
peter |
elements to BinaryFunctor. |
3190 |
30 Mar 14 |
peter |
47 |
|
3190 |
30 Mar 14 |
peter |
Type Requirements: |
3190 |
30 Mar 14 |
peter |
- \c RandomAccessContainer1 must be a |
3190 |
30 Mar 14 |
peter |
<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html"> |
3190 |
30 Mar 14 |
peter |
RandomAccessContainer</a> |
3190 |
30 Mar 14 |
peter |
- \c RandomAccessContainer2 must be a |
3190 |
30 Mar 14 |
peter |
<a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html"> |
3190 |
30 Mar 14 |
peter |
RandomAccessContainer</a> |
3190 |
30 Mar 14 |
peter |
- \c BinaryFunctor must be a |
3190 |
30 Mar 14 |
peter |
<a href="http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html"> |
3190 |
30 Mar 14 |
peter |
AdaptableBinaryFunctor</a> |
3190 |
30 Mar 14 |
peter |
- \c RandomAccessContainer1::reference must be convertible to |
3190 |
30 Mar 14 |
peter |
\c BinaryFunctor::first_argument_type |
3190 |
30 Mar 14 |
peter |
- \c RandomAccessContainer2::reference must be convertible to |
3190 |
30 Mar 14 |
peter |
\c BinaryFunctor::second_argument_type |
3190 |
30 Mar 14 |
peter |
62 |
*/ |
3190 |
30 Mar 14 |
peter |
63 |
template <class RandomAccessRange1, class RandomAccessRange2, |
3190 |
30 Mar 14 |
peter |
64 |
class BinaryFunctor> |
3190 |
30 Mar 14 |
peter |
65 |
class KernelMatrix |
3190 |
30 Mar 14 |
peter |
66 |
{ |
3190 |
30 Mar 14 |
peter |
67 |
public: |
3190 |
30 Mar 14 |
peter |
/// \c value_type is same as BinaryFunctor's result_type |
3190 |
30 Mar 14 |
peter |
69 |
typedef typename BinaryFunctor::result_type value_type; |
3190 |
30 Mar 14 |
peter |
70 |
|
3190 |
30 Mar 14 |
peter |
/// \c const_reference is same as \c value_type |
3190 |
30 Mar 14 |
peter |
72 |
typedef value_type const_reference; |
3190 |
30 Mar 14 |
peter |
73 |
|
3190 |
30 Mar 14 |
peter |
/// \brief \c const_iterator |
3190 |
30 Mar 14 |
peter |
75 |
typedef Container2DIterator<const KernelMatrix, value_type, const_reference> |
3190 |
30 Mar 14 |
peter |
76 |
const_iterator; |
3190 |
30 Mar 14 |
peter |
77 |
|
3190 |
30 Mar 14 |
peter |
/// \brief \c const_column_iterator |
3190 |
30 Mar 14 |
peter |
79 |
typedef StrideIterator<const_iterator> const_column_iterator; |
3190 |
30 Mar 14 |
peter |
80 |
|
3190 |
30 Mar 14 |
peter |
/// \brief \c const_row_iterator_iterator |
3190 |
30 Mar 14 |
peter |
82 |
typedef const_iterator const_row_iterator; |
3190 |
30 Mar 14 |
peter |
83 |
|
3190 |
30 Mar 14 |
peter |
84 |
/** |
3190 |
30 Mar 14 |
peter |
\brief constructor |
3190 |
30 Mar 14 |
peter |
86 |
|
3190 |
30 Mar 14 |
peter |
Same as three-argument constructor, but using default |
3190 |
30 Mar 14 |
peter |
constructor of class BinaryFunctor. |
3190 |
30 Mar 14 |
peter |
89 |
*/ |
3190 |
30 Mar 14 |
peter |
90 |
KernelMatrix(const RandomAccessRange1& r1, const RandomAccessRange2& r2) |
3190 |
30 Mar 14 |
peter |
91 |
: range1_(r1), range2_(r2) {} |
3190 |
30 Mar 14 |
peter |
92 |
|
3190 |
30 Mar 14 |
peter |
93 |
/** |
3190 |
30 Mar 14 |
peter |
\brief constructor |
3190 |
30 Mar 14 |
peter |
95 |
*/ |
3190 |
30 Mar 14 |
peter |
96 |
KernelMatrix(const RandomAccessRange1& r1, const RandomAccessRange2& r2, |
3190 |
30 Mar 14 |
peter |
97 |
const BinaryFunctor& bf) |
3190 |
30 Mar 14 |
peter |
98 |
: range1_(r1), range2_(r2), func_(bf) {} |
3190 |
30 Mar 14 |
peter |
99 |
|
3190 |
30 Mar 14 |
peter |
100 |
/** |
3190 |
30 Mar 14 |
peter |
Iterator iterates along a row. When end of row is reached it |
3190 |
30 Mar 14 |
peter |
jumps to beginning of next row. |
3190 |
30 Mar 14 |
peter |
103 |
|
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to upper-left element. |
3190 |
30 Mar 14 |
peter |
105 |
*/ |
3190 |
30 Mar 14 |
peter |
106 |
const_iterator begin(void) const { return const_iterator(*this, 0, 0); } |
3190 |
30 Mar 14 |
peter |
107 |
|
3190 |
30 Mar 14 |
peter |
108 |
|
3190 |
30 Mar 14 |
peter |
109 |
/** |
3190 |
30 Mar 14 |
peter |
Iterator iterates along a column. |
3190 |
30 Mar 14 |
peter |
111 |
|
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to first element of column \a column. |
3190 |
30 Mar 14 |
peter |
113 |
*/ |
3190 |
30 Mar 14 |
peter |
114 |
const_column_iterator begin_column(size_t column) const |
3190 |
30 Mar 14 |
peter |
115 |
{ |
3190 |
30 Mar 14 |
peter |
116 |
return const_column_iterator(const_iterator(*this, 0, column), |
3190 |
30 Mar 14 |
peter |
117 |
this->columns()); |
3190 |
30 Mar 14 |
peter |
118 |
} |
3190 |
30 Mar 14 |
peter |
119 |
|
3190 |
30 Mar 14 |
peter |
120 |
|
3190 |
30 Mar 14 |
peter |
121 |
/** |
3190 |
30 Mar 14 |
peter |
Iterator iterates along a row. |
3190 |
30 Mar 14 |
peter |
123 |
|
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to first element of row \a row. |
3190 |
30 Mar 14 |
peter |
125 |
*/ |
3190 |
30 Mar 14 |
peter |
126 |
const_row_iterator begin_row(size_t row) const |
3190 |
30 Mar 14 |
peter |
127 |
{ return const_row_iterator(*this, row, 0); } |
3190 |
30 Mar 14 |
peter |
128 |
|
3190 |
30 Mar 14 |
peter |
129 |
|
3190 |
30 Mar 14 |
peter |
130 |
/** |
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to end of matrix |
3190 |
30 Mar 14 |
peter |
132 |
*/ |
3190 |
30 Mar 14 |
peter |
133 |
const_iterator end(void) const |
3190 |
30 Mar 14 |
peter |
134 |
{ return const_iterator(*this, rows(), 0); } |
3190 |
30 Mar 14 |
peter |
135 |
|
3190 |
30 Mar 14 |
peter |
136 |
|
3190 |
30 Mar 14 |
peter |
137 |
/** |
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to end of column \a i |
3190 |
30 Mar 14 |
peter |
139 |
*/ |
3190 |
30 Mar 14 |
peter |
140 |
const_column_iterator end_column(size_t column) const |
3190 |
30 Mar 14 |
peter |
141 |
{ |
3190 |
30 Mar 14 |
peter |
142 |
return const_column_iterator(const_iterator(*this, this->rows(), column), |
3190 |
30 Mar 14 |
peter |
143 |
this->columns()); |
3190 |
30 Mar 14 |
peter |
144 |
} |
3190 |
30 Mar 14 |
peter |
145 |
|
3190 |
30 Mar 14 |
peter |
146 |
|
3190 |
30 Mar 14 |
peter |
147 |
/** |
3190 |
30 Mar 14 |
peter |
\return const_iterator pointing to end of row \a i |
3190 |
30 Mar 14 |
peter |
149 |
*/ |
3190 |
30 Mar 14 |
peter |
150 |
const_row_iterator end_row(size_t row) const |
3190 |
30 Mar 14 |
peter |
151 |
{ return const_row_iterator(*this, row, this->columns()); } |
3190 |
30 Mar 14 |
peter |
152 |
|
3190 |
30 Mar 14 |
peter |
153 |
|
3190 |
30 Mar 14 |
peter |
154 |
/** |
3190 |
30 Mar 14 |
peter |
Number of rows is defined by RandomAccessRange2::size(void) |
3190 |
30 Mar 14 |
peter |
156 |
|
3190 |
30 Mar 14 |
peter |
\return The number of columns in the matrix. |
3190 |
30 Mar 14 |
peter |
158 |
*/ |
3190 |
30 Mar 14 |
peter |
159 |
typename RandomAccessRange2::size_type columns(void) const |
3190 |
30 Mar 14 |
peter |
160 |
{ return range2_.size(); } |
3190 |
30 Mar 14 |
peter |
161 |
|
3190 |
30 Mar 14 |
peter |
162 |
|
3190 |
30 Mar 14 |
peter |
163 |
/** |
3190 |
30 Mar 14 |
peter |
Number of rows is defined by RandomAccessRange1::size(void) |
3190 |
30 Mar 14 |
peter |
165 |
|
3190 |
30 Mar 14 |
peter |
\return The number of rows in the matrix. |
3190 |
30 Mar 14 |
peter |
167 |
*/ |
3190 |
30 Mar 14 |
peter |
168 |
typename RandomAccessRange1::size_type rows(void) const |
3190 |
30 Mar 14 |
peter |
169 |
{ return range1_.size(); } |
3190 |
30 Mar 14 |
peter |
170 |
|
3190 |
30 Mar 14 |
peter |
171 |
|
3190 |
30 Mar 14 |
peter |
172 |
/** |
3190 |
30 Mar 14 |
peter |
\brief Element access operator. |
3190 |
30 Mar 14 |
peter |
174 |
|
3190 |
30 Mar 14 |
peter |
Element is calculated using BinaryFunctor passing |
3190 |
30 Mar 14 |
peter |
\c row th element of RandomAccessRange1 and \c column th element in |
3190 |
30 Mar 14 |
peter |
RandomAccessRange2. |
3190 |
30 Mar 14 |
peter |
178 |
|
3190 |
30 Mar 14 |
peter |
\return Reference to the element position (\a row, \a column). |
3190 |
30 Mar 14 |
peter |
180 |
*/ |
3190 |
30 Mar 14 |
peter |
181 |
const_reference operator()(size_t row, size_t column) const |
3190 |
30 Mar 14 |
peter |
182 |
{ return func_(range1_[row], range2_[column]); } |
3190 |
30 Mar 14 |
peter |
183 |
|
3190 |
30 Mar 14 |
peter |
184 |
private: |
3190 |
30 Mar 14 |
peter |
185 |
RandomAccessRange1 range1_; |
3190 |
30 Mar 14 |
peter |
186 |
RandomAccessRange2 range2_; |
3190 |
30 Mar 14 |
peter |
187 |
BinaryFunctor func_; |
3190 |
30 Mar 14 |
peter |
188 |
}; |
3190 |
30 Mar 14 |
peter |
189 |
|
3190 |
30 Mar 14 |
peter |
190 |
}}} // of namespace utility, yat, and theplu |
3190 |
30 Mar 14 |
peter |
191 |
|
3190 |
30 Mar 14 |
peter |
192 |
#endif |