示例#1
0
arma::vec
dir_generator::sample(const arma::vec &alpha)
{
    arma::vec x = arma::zeros<arma::vec>( alpha.n_elem );
    for(int i = 0; i < alpha.n_elem; i++)
    {
        double runif = m_generator( ) / ( m_generator.max( ) - m_generator.min( ) + 1.0 );
        x[ i ] = gamma_cdf_inv( runif, alpha[ i ], 1.0 );
    }

    return x / sum( x );
}
示例#2
0
double beta_that_forces_requested_median(double alpha,double median)
/*
   If Gamma(alpha,1) has median K
   Then Gamma(alpha,beta) has median K/beta.

   We want median = K/beta, so we put beta = K/median where
     K = Median(Gamma(alpha,1))
*/
{
  double k = gamma_cdf_inv(0.5,alpha,1.0);
  double result = k / median;
  
  {
/*
    double check = gamma_cdf_inv(0.5,alpha,result);
    printf("alpha=%g, goal_median=%g, chosen_beta=%g,actual_median=%g\n",
           alpha,median,result,check
          );
    wait_for_key();
*/
  }

  return(result);
}