00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef MTL_MATRIX_HOUSEHOLDER_INCLUDE
00015 #define MTL_MATRIX_HOUSEHOLDER_INCLUDE
00016
00017 #include <cmath>
00018 #include <boost/numeric/mtl/concept/collection.hpp>
00019
00020
00021 namespace mtl { namespace vector {
00022
00023
00025
00027 template <typename Vector>
00028 std::pair<typename mtl::dense_vector<typename Collection<Vector>::value_type>, typename Collection<Vector>::value_type>
00029 inline householder(Vector& y)
00030 {
00031 typedef typename Collection<Vector>::value_type value_type;
00032 typedef typename Collection<Vector>::size_type size_type;
00033 const value_type zero= math::zero(y[0]), one= math::one(y[0]);
00034
00035 Vector v(y);
00036 v[0]= one;
00037
00038 irange tail(1, imax);
00039 value_type s( dot(v[tail], v[tail]) ), b, v0;
00040
00041
00042 if (s == zero)
00043 b= zero;
00044 else {
00045 value_type mu= sqrt(y[0] * y[0] + s);
00046 v0= v[0]= y[0] < zero ? y[0] - mu : -s / (y[0] + mu);
00047 b= 2 * v0 * v0 / (s + v0 * v0);
00048 v/= v0;
00049 }
00050 return std::make_pair(v,b);
00051 }
00052
00053
00054 }}
00055
00056 #endif // MTL_MATRIX_HOUSEHOLDER_INCLUDE
00057