32 #ifndef TOON_INCLUDE_HELPERS_H
33 #define TOON_INCLUDE_HELPERS_H
41 #define M_PI 3.14159265358979323846
45 #define M_SQRT1_2 0.707106781186547524401
54 for(
int i=0; i < v.size(); i++)
62 for(
int i=0; i < m.num_rows(); i++)
63 for(
int j=0; j < m.num_cols(); j++)
91 for(
int i=0; i < v.size(); i++)
106 for(
int i=1; i < v.size(); i++)
107 n = max(n,
abs(v[i]));
159 return TooN::operator/(v.template slice<0, Len>(0, v.size()-1),v[v.size() - 1]);
169 result.template slice<0, Len>(0, v.size()) = v;
170 result[v.size()] = 1;
178 Matrix<R-1, C, Precision> result = m.template slice(0,0,R-1,m.num_cols());
179 for(
int c = 0; c < m.num_cols(); ++c ) {
180 result.slice(0,c,R-1,1) /= m[R-1][c];
186 Matrix<-1, C, Precision> result = m.template slice(0,0,m.num_rows()-1,m.num_cols());
187 for(
int c = 0; c < m.num_cols(); ++c ) {
188 result.slice(0,c,m.num_rows()-1,1) /= m[m.num_rows()-1][c];
198 result.template slice<0,0,R,C>() = m;
204 Matrix<-1, C, Precision> result( m.num_rows()+1, m.num_cols() );
205 result.template slice(0,0,m.num_rows(),m.num_cols()) = m;
206 result[m.num_rows()] =
Ones;
213 template <
int R,
int C,
typename P,
typename B>
217 for(
int r = 0; r < m.num_rows(); ++r)
218 for(
int c = 0; c < m.num_cols(); ++c)
219 n += m[r][c] * m[r][c];
227 template <
int R,
int C,
typename P,
typename B>
232 for(
int r = 0; r < m.num_rows(); ++r){
234 for(
int c = 0; c < m.num_cols(); ++c)
244 template <
int R,
int C,
typename P,
typename B>
249 for(
int c = 0; c < m.num_cols(); ++c){
251 for(
int r = 0; r < m.num_rows(); ++r)
262 template <
int R,
int C,
typename P,
typename B>
268 while(
norm_inf((result+f)-result) > 0){
283 template <
int R,
int C,
typename P,
typename B>
288 const int s = max(0,(
int)ceil(l));
290 for(
int i = 0; i < s; ++i)
291 result = result * result;
300 for(
int i=0; i < v.size(); i++)
311 for(
int i=0; i < v.size(); i++)
321 template<
int Rows,
int Cols,
typename Precision,
typename Base>
324 for(
int r=0; r<m.num_rows()-1; r++){
325 for(
int c=r+1; c<m.num_cols(); c++){
326 const Precision temp=(m(r,c)+m(c,r))/2;
335 template<
int Rows,
int Cols,
typename Precision,
typename Base>
339 for(
int i = 0; i < m.num_rows(); ++i)
355 result(0,1) = -vec[2];
356 result(0,2) = vec[1];
357 result(1,0) = vec[2];
359 result(1,2) = -vec[0];
360 result(2,0) = -vec[1];
361 result(2,1) = vec[0];
370 if( v.size() == 0 ) {
373 func.initialise( v[0], 0 );
374 for(
int ii = 1; ii < v.size(); ii++ ) {
382 if( m.num_rows() == 0 || m.num_cols() == 0) {
385 func.initialise( m[0][0], 0, 0 );
386 for(
int r=0; r<m.num_rows(); r++){
387 for(
int c=0; c<m.num_cols(); c++){
388 func( m[r][c], r, c );
394 Func func( m.num_rows() );
395 if( m.num_cols() == 0 || m.num_rows() == 0 ) {
398 for(
int r=0; r<m.num_rows(); r++){
399 func.initialise( m[r][0], r, 0 );
400 for(
int c=1; c<m.num_cols(); c++){
401 func( m[r][c], r, c );
407 Func func( m.num_cols() );
408 if( m.num_cols() == 0 || m.num_rows() == 0 ) {
411 for(
int c=0; c<m.num_cols(); c++){
412 func.initialise( m[0][c], 0, c );
413 for(
int r=1; r<m.num_rows(); r++){
414 func( m[r][c], r, c );
420 template<
typename Precision,
typename ComparisonFunctor>
428 bestVal = initialVal;
431 if( ComparisonFunctor()( curVal, bestVal ) ) {
437 template<
typename Precision,
typename ComparisonFunctor>
442 std::pair<Precision,int>
null() {
443 return std::pair<Precision,int>( 0, 0 );
446 bestVal = initialVal;
450 if( ComparisonFunctor()( curVal, bestVal ) ) {
455 std::pair<Precision,int>
ret() {
459 template<
typename Precision,
typename ComparisonFunctor>
467 bestVal = initialVal;
470 if( ComparisonFunctor()( curVal, bestVal ) ) {
476 template<
typename Precision,
typename ComparisonFunctor>
482 std::pair<Precision,std::pair<int,int> >
null() {
483 return std::pair<Precision,std::pair<int,int> >( 0, std::pair<int,int>( 0, 0 ) );
485 void initialise( Precision initialVal,
int nRow,
int nCol ) {
486 bestVal = initialVal;
491 if( ComparisonFunctor()( curVal, bestVal ) ) {
497 std::pair<Precision,std::pair<int,int> >
ret() {
498 return std::pair<Precision,std::pair<int,int> >(
bestVal,
502 template<
typename Precision,
typename ComparisonFunctor>
516 (*bestVal)[nCol] = initialVal;
519 if( ComparisonFunctor()( curVal, (*bestVal)[nCol] ) ) {
520 (*bestVal)[nCol] = curVal;
524 if( bestVal == NULL ) {
532 template<
typename Precision,
typename ComparisonFunctor>
549 void initialise( Precision initialVal,
int nRow,
int nCol ) {
550 (*bestVal)[nCol] = initialVal;
551 (*bestIndices)[nCol] = nRow;
554 if( ComparisonFunctor()( curVal, (*bestVal)[nCol] ) ) {
555 (*bestVal)[nCol] = curVal;
556 (*bestIndices)[nCol] = nRow;
560 if( bestVal == NULL ) {
565 delete bestVal; bestVal = NULL;
570 template<
typename Precision,
typename ComparisonFunctor>
584 (*bestVal)[nRow] = initialVal;
587 if( ComparisonFunctor()( curVal, (*bestVal)[nRow] ) ) {
588 (*bestVal)[nRow] = curVal;
592 if( bestVal == NULL ) {
596 delete bestVal; bestVal = NULL;
600 template<
typename Precision,
typename ComparisonFunctor>
617 void initialise( Precision initialVal,
int nRow,
int nCol ) {
618 (*bestVal)[nRow] = initialVal;
619 (*bestIndices)[nRow] = nCol;
622 if( ComparisonFunctor()( curVal, (*bestVal)[nRow] ) ) {
623 (*bestVal)[nRow] = curVal;
624 (*bestIndices)[nRow] = nCol;
628 if( bestVal == NULL ) {
633 delete bestVal; bestVal = NULL;
647 vector_accumulate_functor, Precision >( v );
655 vector_accumulate_functor, Precision >( v );
664 matrix_accumulate_functor, Precision>( m );
672 matrix_accumulate_functor, Precision>( m );
712 vector_accumulate_functor, std::pair<Precision,int> >( v );
720 vector_accumulate_functor, std::pair<Precision,int> >( v );
728 typedef std::pair<Precision,std::pair<int,int> > Ret;
730 matrix_accumulate_functor, Ret>( m );
738 typedef std::pair<Precision,std::pair<int,int> > Ret;
740 matrix_accumulate_functor, Ret>( m );
751 matrix_accumulate_vertical_functor, Ret >( m );
762 matrix_accumulate_vertical_functor, Ret >( m );
773 matrix_accumulate_vertical_functor, Ret >( m );
784 matrix_accumulate_vertical_functor, Ret >( m );
accumulate_vertical_functor(int nNumCols)
std::pair< Precision, int > min_element(const Vector< Size, Precision, Base > &v)
void normalize(Vector< Size, Precision, Base > v)
std::pair< Precision, int > ret()
void initialise(Precision initialVal, int nRow, int nCol)
Internal::MatrixStartFill< R, C, Precision, Base > Fill(Matrix< R, C, Precision, Base > &m)
Vector< Dynamic, Precision > ret()
TooN::Matrix< 3, 3, P > cross_product_matrix(const Vector< Size, P, B > &vec)
void Symmetrize(Matrix< Rows, Cols, Precision, Base > &m)
void initialise(Precision initialVal, int, int)
Precision norm_inf(const Vector< Size, Precision, Base > &v)
void operator()(Precision curVal, int nIndex)
Operator< Op< typename Internal::DivideType< Pl, Pr >::type > > operator/(const Operator< Op< Pl > > &l, const Pr &r)
Vector< Dynamic, Precision > max_value_vertical(const Matrix< R, C, Precision, Base > &m)
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > null()
Vector< Dynamic, Precision > min_value_vertical(const Matrix< R, C, Precision, Base > &m)
static Operator< Internal::Identity< Internal::One > > Identity
accumulate_vertical_functor()
std::pair< Precision, std::pair< int, int > > null()
Ret accumulate_vertical(const Matrix< R, C, Precision, Base > &m)
Vector< Dynamic, Precision > * bestIndices
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > ret()
TooN::Vector< 2 > vec(const ImageRef &ir)
Everything lives inside this namespace.
void operator()(Precision curVal, int nRow, int nCol)
Matrix< R, C, P > exp_taylor(const Matrix< R, C, P, B > &m)
static const int Dynamic
Template size value used to indicate dynamically sized vectors and matrices.
static void test(int s1, int s2)
Vector<(Size==Dynamic?Dynamic:Size+1), Precision > unproject(const Vector< Size, Precision, Base > &v)
accumulate_horizontal_functor(int nNumRows)
void operator()(Precision curVal, int, int nCol)
bool isfinite(const Vector< S, P, B > &v)
static const Operator< Internal::Scalars< Internal::One > > Ones
Precision max_value(const Vector< Size, Precision, Base > &v)
P norm_fro(const Matrix< R, C, P, B > &m)
void initialise(Precision initialVal, int nIndex)
void initialise(Precision initialVal, int nRow, int nCol)
void operator()(Precision curVal, int nRow, int nCol)
accumulate_element_vertical_functor(int nNumCols)
Precision trace(const Matrix< Rows, Cols, Precision, Base > &m)
Precision norm(const Vector< Size, Precision, Base > &v)
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > min_element_horizontal(const Matrix< R, C, Precision, Base > &m)
accumulate_element_vertical_functor()
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > null()
Ret accumulate_horizontal(const Matrix< R, C, Precision, Base > &m)
accumulate_horizontal_functor()
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > max_element_horizontal(const Matrix< R, C, Precision, Base > &m)
Matrix< R, C, P > exp(const Matrix< R, C, P, B > &m)
std::pair< Precision, int > null()
std::pair< Precision, int > max_element(const Vector< Size, Precision, Base > &v)
void initialise(Precision initialVal, int nRow, int)
void initialise(Precision initialVal, int nRow, int nCol)
accumulate_element_horizontal_functor(int nNumRows)
Vector< Dynamic, Precision > max_value_horizontal(const Matrix< R, C, Precision, Base > &m)
void operator()(Precision curVal, int nRow, int)
Vector< Dynamic, Precision > null()
Vector< Dynamic, Precision > min_value_horizontal(const Matrix< R, C, Precision, Base > &m)
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > ret()
Vector< Dynamic, Precision > * bestVal
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > max_element_vertical(const Matrix< R, C, Precision, Base > &m)
Precision norm_sq(const Vector< Size, Precision, Base > &v)
accumulate_element_horizontal_functor()
void initialise(Precision initialVal, int, int nCol)
Vector< Size, Precision > unit(const Vector< Size, Precision, Base > &v)
Ret accumulate(const Vector< Size, Precision, Base > &v)
void initialise(Precision initialVal, int)
Vector< Dynamic, Precision > * bestVal
Vector< Dynamic, Precision > * bestVal
std::pair< Vector< Dynamic, Precision >, Vector< Dynamic, Precision > > min_element_vertical(const Matrix< R, C, Precision, Base > &m)
Vector< Dynamic, Precision > null()
void operator()(Precision curVal, int, int)
Vector< Dynamic, Precision > * bestIndices
Precision min_value(const Vector< Size, Precision, Base > &v)
void operator()(Precision curVal, int nRow, int nCol)
std::pair< Precision, std::pair< int, int > > ret()
void operator()(Precision curVal, int)
Vector< Internal::Sizer< S1, S2 >::size, typename Internal::MultiplyType< P1, P2 >::type > operator*(const DiagonalMatrix< S1, P1, B1 > &d, const Vector< S2, P2, B2 > &v)
Vector< Dynamic, Precision > ret()
static Operator< Internal::Zero > Zeros
Precision norm_2(const Vector< Size, Precision, Base > &v)
Vector<(Size==Dynamic?Dynamic:Size-1), Precision > project(const Vector< Size, Precision, Base > &v)
bool isnan(const Vector< S, P, B > &v)
Precision norm_1(const Vector< Size, Precision, Base > &v)
Vector< Dynamic, Precision > * bestVal