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 ); }
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); }