-
Mark Woolrich authoredMark Woolrich authored
miscmaths.h 8.60 KiB
/* miscmaths.h
Mark Jenkinson & Mark Woolrich & Christian Beckmann, FMRIB Image Analysis Group
Copyright (C) 1999-2000 University of Oxford */
/* CCOPYRIGHT */
// Miscellaneous maths functions
#if !defined(__miscmaths_h)
#define __miscmaths_h
#include <cmath>
#include <vector>
#include <iostream>
#include <assert.h>
#include <fstream>
#include <strstream>
#include <string>
#include "newmatap.h"
#include "kernel.h"
//#pragma interface
using namespace NEWMAT;
using namespace std;
namespace MISCMATHS {
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#define OUT(t) cout<<#t "="<<t<<endl;
// IO/string stuff
template <class T> string num2str(T n, int width=-1);
bool isnum(const string& str);
ReturnMatrix read_ascii_matrix(const string& filename, int nrows, int ncols);
ReturnMatrix read_ascii_matrix(int nrows, int ncols, const string& filename);
ReturnMatrix read_ascii_matrix(const string& filename);
ReturnMatrix read_vest(string p_fname);
ReturnMatrix read_binary_matrix(const string& filename);
int write_ascii_matrix(const Matrix& mat, const string& filename,
int precision=-1);
int write_ascii_matrix(const string& filename, const Matrix& mat,
int precision=-1);
int write_vest(const Matrix& x, string p_fname, int precision=-1);
int write_vest(string p_fname, const Matrix& x, int precision=-1);
int write_binary_matrix(const Matrix& mat, const string& filename);
// more basic IO calls
string skip_alpha(ifstream& fs);
ReturnMatrix read_ascii_matrix(ifstream& fs, int nrows, int ncols);
ReturnMatrix read_ascii_matrix(int nrows, int ncols, ifstream& fs);
ReturnMatrix read_ascii_matrix(ifstream& fs);
ReturnMatrix read_binary_matrix(ifstream& fs);
int write_ascii_matrix(const Matrix& mat, ofstream& fs, int precision=-1);
int write_ascii_matrix(ofstream& fs, const Matrix& mat, int precision=-1);
int write_binary_matrix(const Matrix& mat, ofstream& fs);
// General maths
int round(int x);
int round(float x);
int round(double x);
inline int sign(int x){ if (x>0) return 1; else { if (x<0) return -1; else return 0; } }
inline int sign(float x){ if (x>0) return 1; else { if (x<0) return -1; else return 0; } }
inline int sign(double x){ if (x>0) return 1; else { if (x<0) return -1; else return 0; } }
inline double pow(double x, float y) { return std::pow(x,(double) y); }
inline double pow(float x, double y) { return std::pow((double) x,y); }
inline double pow(double x, int y) { return std::pow(x,(double) y); }
inline float pow(float x, int y) { return std::pow(x,(float) y); }
inline double pow(int x, double y) { return std::pow((double)x, y); }
inline float pow(int x, float y) { return std::pow((float)x, y); }
inline double sqrt(int x) { return std::sqrt((double) x); }
inline double log(int x) { return std::log((double) x); }
float Sinc(const float x);
double Sinc(const double x);
int periodicclamp(int x, int x1, int x2);
template<class S, class T>
inline T Min(const S &a, const T &b) { if (a<b) return (T) a; else return b; }
template<class S, class T>
inline T Max(const S &a, const T &b) { if (a>b) return (T) a; else return b; }
template<class T>
inline T Sqr(const T& x) { return x*x; }
ColumnVector cross(const ColumnVector& a, const ColumnVector& b);
ColumnVector cross(const Real *a, const Real *b);
inline float dot(const ColumnVector& a, const ColumnVector& b)
{ return Sum(SP(a,b)); }
double norm2(const ColumnVector& x);
double norm2(double a, double b, double c);
float norm2(float a, float b, float c);
int Identity(Matrix& m);
ReturnMatrix Identity(int num);
int diag(Matrix& m, const float diagvals[]);
int diag(Matrix& m, const ColumnVector& diagvals);
int diag(DiagonalMatrix& m, const ColumnVector& diagvals);
ReturnMatrix diag(const Matrix& mat);
ReturnMatrix pinv(const Matrix& mat);
ReturnMatrix sqrtaff(const Matrix& mat);
void reshape(Matrix& r, const Matrix& m, int nrows, int ncols);
ReturnMatrix reshape(const Matrix& m, int nrows, int ncols);
int construct_rotmat_euler(const ColumnVector& params, int n, Matrix& aff);
int construct_rotmat_euler(const ColumnVector& params, int n, Matrix& aff,
const ColumnVector& centre);
int construct_rotmat_quat(const ColumnVector& params, int n, Matrix& aff);
int construct_rotmat_quat(const ColumnVector& params, int n, Matrix& aff,
const ColumnVector& centre);
int make_rot(const ColumnVector& angl, const ColumnVector& centre,
Matrix& rot);
int getrotaxis(ColumnVector& axis, const Matrix& rotmat);
int rotmat2euler(ColumnVector& angles, const Matrix& rotmat);
int rotmat2quat(ColumnVector& quaternion, const Matrix& rotmat);
int decompose_aff(ColumnVector& params, const Matrix& affmat,
int (*rotmat2params)(ColumnVector& , const Matrix& ));
int decompose_aff(ColumnVector& params, const Matrix& affmat,
const ColumnVector& centre,
int (*rotmat2params)(ColumnVector& , const Matrix& ));
int compose_aff(const ColumnVector& params, int n, const ColumnVector& centre,
Matrix& aff,
int (*params2rotmat)(const ColumnVector& , int , Matrix& ,
const ColumnVector& ) );
float rms_deviation(const Matrix& affmat1, const Matrix& affmat2,
const ColumnVector& centre, const float rmax);
float rms_deviation(const Matrix& affmat1, const Matrix& affmat2,
const float rmax=80.0);
float median(const ColumnVector& x);
// returns the first P such that 2^P >= abs(N).
int nextpow2(int n);
// Auto-correlation function estimate of columns of p_ts
// gives unbiased estimate - scales the raw correlation by 1/(N-abs(lags))
void xcorr(const Matrix& p_ts, Matrix& ret, int lag = 0, int p_zeropad = 0);
ReturnMatrix xcorr(const Matrix& p_ts, int lag = 0, int p_zeropad = 0);
// removes trend from columns of p_ts
// if p_level==0 it just removes the mean
// if p_level==1 it removes linear trend
// if p_level==2 it removes quadratic trend
void detrend(Matrix& p_ts, int p_level=1);
ReturnMatrix zeros(const int dim1, const int dim2 = -1);
ReturnMatrix ones(const int dim1, const int dim2 = -1);
ReturnMatrix repmat(const Matrix& mat, const int rows = 1, const int cols = 1);
ReturnMatrix dist2(const Matrix& mat1, const Matrix& mat2);
ReturnMatrix abs(const Matrix& mat);
ReturnMatrix sqrt(const Matrix& mat);
ReturnMatrix log(const Matrix& mat);
ReturnMatrix exp(const Matrix& mat);
ReturnMatrix tanh(const Matrix& mat);
ReturnMatrix pow(const Matrix& mat, const double exp);
ReturnMatrix sum(const Matrix& mat, const int dim = 1);
ReturnMatrix mean(const Matrix& mat, const int dim = 1);
ReturnMatrix var(const Matrix& mat, const int dim = 1);
ReturnMatrix max(const Matrix& mat);
ReturnMatrix max(const Matrix& mat,ColumnVector& index);
ReturnMatrix min(const Matrix& mat);
ReturnMatrix gt(const Matrix& mat1,const Matrix& mat2);
ReturnMatrix lt(const Matrix& mat1,const Matrix& mat2);
ReturnMatrix geqt(const Matrix& mat1,const Matrix& mat2);
ReturnMatrix leqt(const Matrix& mat1,const Matrix& mat2);
ReturnMatrix eq(const Matrix& mat1,const Matrix& mat2);
ReturnMatrix neq(const Matrix& mat1,const Matrix& mat2);
void remmean(const Matrix& mat, Matrix& demeanedmat, Matrix& Mean, const int dim = 1);
ReturnMatrix remmean(const Matrix& mat, const int dim = 1);
ReturnMatrix stdev(const Matrix& mat, const int dim = 1);
ReturnMatrix cov(const Matrix& mat, const int norm = 0);
ReturnMatrix corrcoef(const Matrix& mat, const int norm = 0);
void symm_orth(Matrix &Mat);
void powerspectrum(const Matrix &Mat1, Matrix &Result, bool useLog);
vector<float> ColumnVector2vector(const ColumnVector& col);
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// TEMPLATE DEFINITIONS //
template<class t> ReturnMatrix vector2ColumnVector(const vector<t>& vec)
{
ColumnVector col(vec.size());
for(unsigned int c = 0; c < vec.size(); c++)
col(c+1) = vec[c];
col.Release();
return col;
}
template<class t> void write_vector(const string& fname, const vector<t>& vec)
{
ofstream out;
out.open(fname.c_str(), ios::out);
copy(vec.begin(), vec.end(), ostream_iterator<t>(out, " "));
}
template<class t> void write_vector(const vector<t>& vec, const string& fname)
{
write_vector(fname,vec);
}
template <class T>
string num2str(T n, int width)
{
ostrstream os;
if (width>0) {
os.fill('0');
os.width(width);
os.setf(ios::internal, ios::adjustfield);
}
os << n << '\0';
return os.str();
}
}
#endif