Skip to content
Snippets Groups Projects
miscprob.cc 3.24 KiB
Newer Older
Christian Beckmann's avatar
Christian Beckmann committed
/*  miscprob.cc

    Christian Beckmann & Mark Woolrich, FMRIB Image Analysis Group

    Copyright (C) 1999-2000 University of Oxford  */

/*  CCOPYRIGHT  */

// Miscellaneous maths functions that rely on libprob

#include "miscprob.h"
#include "stdlib.h"
#include "newmatio.h"
#include <iostream>
Christian Beckmann's avatar
Christian Beckmann committed

using namespace NEWMAT;

namespace MISCMATHS {

ReturnMatrix unifrnd(const int dim1, const int dim2, const float start, const float end)
{
  int tdim = dim2;
  double tmpD=1.0;
  if(tdim<0){tdim=dim1;}
  Matrix res(dim1,tdim);
  for (int mc=1; mc<=res.Ncols(); mc++) {
    for (int mr=1; mr<=res.Nrows(); mr++) {
      tmpD = (rand()+1)/double(RAND_MAX+2.0);
      res(mr,mc)=(tmpD)*(end-start)+start;
      //drand(&tmpD);
      //res(mr,mc)=(tmpD-1)*(end-start)+start;
Christian Beckmann's avatar
Christian Beckmann committed
    }
  }

  res.Release();
  return res;
}

ReturnMatrix normrnd(const int dim1, const int dim2, const float mu, const float sigma)
{
  int tdim = dim2;
  double tmpD=1.0;
  if(tdim<0){tdim=dim1;}
  Matrix res(dim1,tdim);
  for (int mc=1; mc<=res.Ncols(); mc++) {
    for (int mr=1; mr<=res.Nrows(); mr++) {
      tmpD = (rand()+1)/double(RAND_MAX+2.0);
      res(mr,mc)=ndtri(tmpD)*sigma+mu ;
      //drand(&tmpD);
      //res(mr,mc)=ndtri(tmpD-1)*sigma+mu ;
Christian Beckmann's avatar
Christian Beckmann committed
    }
  }

  res.Release();

  return res;
}

Stephen Smith's avatar
Stephen Smith committed
ReturnMatrix normpdf(const RowVector& vals, const float mu, const float var)
Christian Beckmann's avatar
Christian Beckmann committed
{
  RowVector res(vals);
  for (int mc=1; mc<=res.Ncols(); mc++){
Stephen Smith's avatar
Stephen Smith committed
    res(mc) = std::exp(-0.5*(std::pow(vals(mc)-mu,2)/var))*std::pow(2*M_PI*var,-0.5);
Christian Beckmann's avatar
Christian Beckmann committed
  }

  res.Release();
  return res;
}

ReturnMatrix normcdf(const RowVector& vals, const float mu, const float var)
{
  RowVector res(vals);
  RowVector tmp;
  tmp = (vals-mu)/std::sqrt(var);
  for (int mc=1; mc<=res.Ncols(); mc++){
    res(mc) = ndtr(tmp(mc));
  }

  res.Release();
  return res;
}

Stephen Smith's avatar
Stephen Smith committed
ReturnMatrix gammacdf(const RowVector& vals, const float mu, const float var)
Christian Beckmann's avatar
Christian Beckmann committed
{
  RowVector res(vals);
  res=0;
Stephen Smith's avatar
Stephen Smith committed
  if((mu>0)&&(var>0)){
    float b = std::pow(mu,2)/var;
    float a = mu/var;  
Christian Beckmann's avatar
Christian Beckmann committed
    for (int mc=1; mc<=res.Ncols(); mc++){
      if(vals(mc)>0)
	res(mc) = gdtr(a,b,vals(mc));
    }
  }
  res.Release();
  return res;
}

Stephen Smith's avatar
Stephen Smith committed
ReturnMatrix gammapdf(const RowVector& vals, const float mu, const float var)
Christian Beckmann's avatar
Christian Beckmann committed
{
  RowVector res(vals);
  res=0;
Stephen Smith's avatar
Stephen Smith committed
  if((mu>0)&&(var>0.00001)){
    float a = std::pow(mu,2)/var;
    float b = mu/var;
Christian Beckmann's avatar
Christian Beckmann committed
    float c = lgam(a);
    if(std::abs(c) < 150){
      for (int mc=1; mc<=res.Ncols(); mc++){
	if(vals(mc)>0.000001){
	  res(mc) = std::exp(a*std::log(b) + 
			     (a-1) * std::log(vals(mc)) 
			     - b*vals(mc) - c);
	}
      }
    }
  }
  res.Release();
  return res;
}


Stephen Smith's avatar
Stephen Smith committed
ReturnMatrix normpdf(const RowVector& vals, const RowVector& mu, const RowVector& var)
Christian Beckmann's avatar
Christian Beckmann committed
{
  Matrix res(mu.Ncols(),vals.Ncols());
  for (int mc=1; mc<=res.Ncols(); mc++){
    for (int mr=1; mr<=res.Nrows(); mr++){
Stephen Smith's avatar
Stephen Smith committed
      res(mr,mc) = std::exp(-0.5*(std::pow(vals(mc)-mu(mr),2)/var(mr)))*std::pow(2*M_PI*var(mr),-0.5);
Christian Beckmann's avatar
Christian Beckmann committed
    }
  }

  res.Release();
  return res;
}


Mark Woolrich's avatar
Mark Woolrich committed
ReturnMatrix mvnrnd(const RowVector& mu, const SymmetricMatrix& covar, int nsamp) 
Christian Beckmann's avatar
Christian Beckmann committed
{     
//   Matrix eig_vec; 
//   DiagonalMatrix eig_val;
//   EigenValues(covar,eig_val,eig_vec);

//   Matrix ret = ones(nsamp, 1)*mu + dnormrandm(nsamp,mu.Ncols())*sqrt(eig_val)*eig_vec.t();
  Mvnormrandm mvn(mu, covar);

  return mvn.next(nsamp);
}

}