00001
00002 #ifndef vnl_diag_matrix_fixed_h_
00003 #define vnl_diag_matrix_fixed_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <vcl_cassert.h>
00022 #include <vcl_iosfwd.h>
00023 #include <vnl/vnl_vector_fixed.h>
00024 #include <vnl/vnl_matrix_fixed.h>
00025
00026
00027 template <class T, unsigned int N> class vnl_diag_matrix_fixed;
00028 template <class T, unsigned int N> vnl_vector_fixed<T,N> operator*(vnl_diag_matrix_fixed<T,N> const&, vnl_vector_fixed<T,N> const&);
00029
00030
00031
00032
00033
00034
00035
00036 export
00037 template <class T, unsigned int N>
00038 class vnl_diag_matrix_fixed
00039 {
00040 vnl_vector_fixed<T,N> diagonal_;
00041
00042 public:
00043 vnl_diag_matrix_fixed() {}
00044
00045
00046
00047 vnl_diag_matrix_fixed(T const& value) : diagonal_(N, value) {}
00048
00049
00050
00051 explicit vnl_diag_matrix_fixed(vnl_vector_fixed<T,N> const& that): diagonal_(that) {}
00052 ~vnl_diag_matrix_fixed() {}
00053
00054 inline vnl_diag_matrix_fixed& operator=(vnl_diag_matrix_fixed<T,N> const& that) {
00055 this->diagonal_ = that.diagonal_;
00056 return *this;
00057 }
00058
00059
00060
00061
00062 inline vnl_diag_matrix_fixed<T,N>& operator*=(T v) { diagonal_ *= v; return *this; }
00063
00064 inline vnl_diag_matrix_fixed<T,N>& operator/=(T v) { diagonal_ /= v; return *this; }
00065
00066
00067
00068 void invert_in_place();
00069 T determinant() const;
00070 vnl_vector_fixed<T,N> solve(vnl_vector_fixed<T,N> const& b) const;
00071 void solve(vnl_vector_fixed<T,N> const& b, vnl_vector_fixed<T,N>* out) const;
00072
00073
00074
00075 inline T operator () (unsigned i, unsigned j) const {
00076 return (i != j) ? T(0) : diagonal_[i];
00077 }
00078
00079 inline T& operator () (unsigned i, unsigned j) {
00080 assert(i == j);
00081 return diagonal_[i];
00082 }
00083 inline T& operator() (unsigned i) { return diagonal_[i]; }
00084 inline T const& operator() (unsigned i) const { return diagonal_[i]; }
00085
00086 inline T& operator[] (unsigned i) { return diagonal_[i]; }
00087 inline T const& operator[] (unsigned i) const { return diagonal_[i]; }
00088
00089
00090 inline void put (unsigned r, unsigned c, T const& v) {
00091 assert(r == c); assert (r<size()); diagonal_[r] = v;
00092 }
00093
00094
00095 inline T get (unsigned r, unsigned c) const {
00096 assert(r == c); assert (r<size()); return diagonal_[r];
00097 }
00098
00099
00100 inline void fill_diagonal (T const& v) { diagonal_.fill(v); }
00101
00102
00103
00104 typedef typename vnl_vector_fixed<T,N>::iterator iterator;
00105 inline iterator begin() { return diagonal_.begin(); }
00106 inline iterator end() { return diagonal_.end(); }
00107 typedef typename vnl_vector_fixed<T,N>::const_iterator const_iterator;
00108 inline const_iterator begin() const { return diagonal_.begin(); }
00109 inline const_iterator end() const { return diagonal_.end(); }
00110
00111 inline unsigned size() const { return diagonal_.size(); }
00112 inline unsigned rows() const { return diagonal_.size(); }
00113 inline unsigned cols() const { return diagonal_.size(); }
00114 inline unsigned columns() const { return diagonal_.size(); }
00115
00116
00117 inline vnl_matrix_fixed<T,N,N> as_matrix_fixed() const;
00118
00119 inline vnl_matrix_fixed<T,N,N> as_ref() const { return as_matrix_fixed(); }
00120
00121
00122 inline operator vnl_matrix_fixed<T,N,N> () const { return as_matrix_fixed(); }
00123
00124 inline void fill(T const &x) { diagonal_.fill(x); }
00125
00126
00127 inline T* data_block() { return diagonal_.data_block(); }
00128 inline T const* data_block() const { return diagonal_.data_block(); }
00129
00130
00131 inline vnl_vector_fixed<T,N> const& diagonal() const { return diagonal_; }
00132
00133
00134 inline void set(vnl_vector_fixed<T,N> const& v) { diagonal_=v; }
00135
00136 private:
00137 #if VCL_NEED_FRIEND_FOR_TEMPLATE_OVERLOAD
00138 friend vnl_vector_fixed<T,N> operator*(vnl_diag_matrix_fixed<T,N> const&,vnl_vector_fixed<T,N> const&);
00139 #endif
00140 };
00141
00142
00143
00144 template <class T, unsigned int N>
00145 vcl_ostream& operator<< (vcl_ostream&, vnl_diag_matrix_fixed<T,N> const&);
00146
00147
00148 template <class T, unsigned int N>
00149 inline vnl_matrix_fixed<T,N,N> vnl_diag_matrix_fixed<T,N>::as_matrix_fixed() const
00150 {
00151 vnl_matrix_fixed<T,N,N> ret;
00152 for (unsigned i = 0; i < N; ++i)
00153 {
00154 unsigned j;
00155 for (j = 0; j < i; ++j)
00156 ret(i,j) = T(0);
00157 for (j = i+1; j < N; ++j)
00158 ret(i,j) = T(0);
00159 ret(i,i) = diagonal_[i];
00160 }
00161 return ret;
00162 }
00163
00164
00165
00166 template <class T, unsigned int N>
00167 inline void vnl_diag_matrix_fixed<T,N>::invert_in_place()
00168 {
00169 T* d = data_block();
00170 T one = T(1);
00171 for (unsigned i = 0; i < N; ++i)
00172 d[i] = one / d[i];
00173 }
00174
00175
00176 template <class T, unsigned int N>
00177 inline T vnl_diag_matrix_fixed<T,N>::determinant() const
00178 {
00179 T det = T(1);
00180 T const* d = data_block();
00181 for (unsigned i = 0; i < N; ++i)
00182 det *= d[i];
00183 return det;
00184 }
00185
00186
00187
00188 template <class T, unsigned int N>
00189 inline vnl_diag_matrix_fixed<T,N> operator* (vnl_diag_matrix_fixed<T,N> const& A, vnl_diag_matrix_fixed<T,N> const& B)
00190 {
00191 vnl_diag_matrix_fixed<T,N> ret = A;
00192 for (unsigned i = 0; i < N; ++i)
00193 ret(i,i) *= B(i,i);
00194 return ret;
00195 }
00196
00197
00198
00199
00200 template <class T, unsigned int R, unsigned int C>
00201 inline vnl_matrix_fixed<T,R,C> operator* (vnl_matrix_fixed<T,R,C> const& A, vnl_diag_matrix_fixed<T,C> const& D)
00202 {
00203 vnl_matrix_fixed<T,R,C> ret;
00204 for (unsigned i = 0; i < R; ++i)
00205 for (unsigned j = 0; j < C; ++j)
00206 ret(i,j) = A(i,j) * D(j,j);
00207 return ret;
00208 }
00209
00210
00211
00212
00213 template <class T, unsigned int R, unsigned int C>
00214 inline vnl_matrix_fixed<T,R,C> operator* (vnl_diag_matrix_fixed<T,R> const& D, vnl_matrix_fixed<T,R,C> const& A)
00215 {
00216 vnl_matrix_fixed<T,R,C> ret;
00217 T const* d = D.data_block();
00218 for (unsigned i = 0; i < R; ++i)
00219 for (unsigned j = 0; j < C; ++j)
00220 ret(i,j) = A(i,j) * d[i];
00221 return ret;
00222 }
00223
00224
00225
00226 template <class T, unsigned int N>
00227 inline vnl_diag_matrix_fixed<T,N> operator+ (vnl_diag_matrix_fixed<T,N> const& A, vnl_diag_matrix_fixed<T,N> const& B)
00228 {
00229 vnl_diag_matrix_fixed<T,N> ret = A;
00230 for (unsigned i = 0; i < N; ++i)
00231 ret(i,i) += B(i,i);
00232 return ret;
00233 }
00234
00235
00236
00237
00238 template <class T, unsigned int N>
00239 inline vnl_matrix_fixed<T,N,N> operator+ (vnl_matrix_fixed<T,N,N> const& A, vnl_diag_matrix_fixed<T,N> const& D)
00240 {
00241 vnl_matrix_fixed<T,N,N> ret(A);
00242 T const* d = D.data_block();
00243 for (unsigned j = 0; j < N; ++j)
00244 ret(j,j) += d[j];
00245 return ret;
00246 }
00247
00248
00249
00250
00251 template <class T, unsigned int N>
00252 inline vnl_matrix_fixed<T,N,N> operator+ (vnl_diag_matrix_fixed<T,N> const& D, vnl_matrix_fixed<T,N,N> const& A)
00253 {
00254 return A + D;
00255 }
00256
00257
00258
00259 template <class T, unsigned int N>
00260 inline vnl_diag_matrix_fixed<T,N> operator- (vnl_diag_matrix_fixed<T,N> const& A, vnl_diag_matrix_fixed<T,N> const& B)
00261 {
00262 vnl_diag_matrix_fixed<T,N> ret(A);
00263 for (unsigned i = 0; i < N; ++i)
00264 ret(i,i) -= B(i,i);
00265 return ret;
00266 }
00267
00268
00269
00270
00271 template <class T, unsigned int N>
00272 inline vnl_matrix_fixed<T,N,N> operator- (vnl_matrix_fixed<T,N,N> const& A, vnl_diag_matrix_fixed<T,N> const& D)
00273 {
00274 vnl_matrix_fixed<T,N,N> ret(A);
00275 T const* d = D.data_block();
00276 for (unsigned j = 0; j < N; ++j)
00277 ret(j,j) -= d[j];
00278 return ret;
00279 }
00280
00281
00282
00283
00284 template <class T, unsigned int N>
00285 inline vnl_matrix_fixed<T,N,N> operator- (vnl_diag_matrix_fixed<T,N> const& D, vnl_matrix_fixed<T,N,N> const& A)
00286 {
00287 vnl_matrix_fixed<T,N,N> ret;
00288 T const* d = D.data_block();
00289 for (unsigned i = 0; i < N; ++i)
00290 {
00291 for (unsigned j = 0; j < i; ++j)
00292 ret(i,j) = -A(i,j);
00293 for (unsigned j = i+1; j < N; ++j)
00294 ret(i,j) = -A(i,j);
00295 ret(i,i) = d[i] - A(i,i);
00296 }
00297 return ret;
00298 }
00299
00300
00301
00302
00303 template <class T, unsigned int N>
00304 inline vnl_vector_fixed<T,N> operator* (vnl_diag_matrix_fixed<T,N> const& D, vnl_vector_fixed<T,N> const& A)
00305 {
00306 return element_product(D.diagonal(), A);
00307 }
00308
00309
00310
00311
00312 template <class T, unsigned int N>
00313 inline vnl_vector_fixed<T,N> operator* (vnl_vector_fixed<T,N> const& A, vnl_diag_matrix_fixed<T,N> const& D)
00314 {
00315 return element_product(D.diagonal(), A);
00316 }
00317
00318 #endif // vnl_diag_matrix_fixed_h_