13 #include <boost/numeric/ublas/vector.hpp>
14 #include <boost/numeric/ublas/vector_proxy.hpp>
15 #include <boost/numeric/ublas/matrix.hpp>
16 #include <boost/numeric/ublas/triangular.hpp>
17 #include <boost/numeric/ublas/operation.hpp>
18 #include <boost/numeric/ublas/lu.hpp>
20 namespace ublas = boost::numeric::ublas;
37 template<
class ValueType>
38 bool affine_fit(
const ublas::matrix<ValueType>& q_,
const ublas::matrix<ValueType>& p,
39 ublas::matrix<ValueType>& A, ublas::vector<ValueType>& b )
41 assert( (q_.size1()==p.size1()) && (q_.size2()==p.size2()) );
43 using namespace ublas;
45 unsigned int n = q_.size1();
46 unsigned int m = q_.size2();
49 ublas::matrix<ValueType> q = q_;
51 for(
unsigned int i=0; i < m; ++i )
56 ublas::matrix<ValueType> Q( n+1, n+1 );
57 for(
unsigned int i=0; i < n+1; ++i )
58 for(
unsigned int j=0; j <= i; ++j )
61 for(
unsigned int k=0; k < m; ++k )
62 Q(i,j) += q(i,k)*q(j,k);
70 ublas::matrix<ValueType> C( n+1, n );
71 for(
unsigned int k=0; k < n+1; ++k )
72 for(
unsigned int j=0; j < n; ++j )
75 for(
unsigned int i=0; i < m; ++i )
76 C(k,j) += q(k,i)*p(j,i);
84 permutation_matrix<double> perm(n+1);
85 if( lu_factorize( Q, perm ) != 0 )
87 std::cout <<
"Stumbled upon a singular matrix during LU decomposition!" << std::endl;
92 ublas::matrix<ValueType> inverse;
93 inverse = identity_matrix<double>(Q.size1());
94 lu_substitute( Q, perm, inverse );
98 A = prod( inverse, C );
111 template<
class ValueType>
114 using namespace ublas;
116 unsigned int m = A.size1();
117 unsigned int n = A.size2();
121 ublas::vector<ValueType> mean(n);
122 mean = zero_vector<ValueType>(n);
124 for(
unsigned int i=0; i < m; ++i )
125 mean += matrix_row<matrix<ValueType> >( A, i );
135 template<
class ValueType>
136 ublas::vector<ValueType>
row_means( ublas::matrix<ValueType>& A )
138 using namespace ublas;
140 unsigned int m = A.size1();
141 unsigned int n = A.size2();
145 ublas::vector<ValueType> mean(m);
146 mean = zero_vector<ValueType>(m);
148 for(
unsigned int j=0; j < n; ++j )
149 mean += matrix_column<matrix<ValueType> >( A, j );
159 template<
class ValueType>
163 for(
unsigned int i=0; i < A.size1(); ++i )
164 for(
unsigned int j=0; j < A.size2(); ++j )
167 gm *= 1.0 / (A.size1()*A.size2());
174 template<
class ValueType>
177 typedef ublas::vector<ValueType> Vector;
189 for(
unsigned int i=0; i < D.size1(); ++i )
190 for(
unsigned int j=0; j < D.size2(); ++j )
192 D(i,j) = D(i,j) - cmeans(i) - rmeans(j) + gmean;
197 template<
class ValueType>
198 void zero_eps( ublas::matrix<ValueType>& A, ValueType eps = 1e-7 )
200 for(
unsigned int i=0; i < A.size1(); ++i )
201 for(
unsigned int j=0; j < A.size2(); ++j )
203 if( fabs(A(i,j)) < eps ) A(i,j)=0.0;
208 template<
class ValueType>
209 void zero_eps( ublas::vector<ValueType>& v, ValueType eps = 1e-7 )
211 for(
unsigned int i=0; i < v.size(); ++i )
212 if( fabs(v(i)) < eps ) v(i)=0.0;
217 #endif // UBLASTOOLS_H