## RandMultiGauss |

Class defining methods for firing multivariate gaussian distributed
random values, given a vector of means and a covariance matrix.
Definitions are those from
*1998 Review of Particle Physics, section 28.3.3.*

This utilizes the following other components of CLHEP:

The author of this distribution relies on `diagonalize()`
being correct.

Although original distribution classes in the *CLHEP Random*
package return a `HepDouble` when `fire()`
(or `operator()`) is done, `RandMultiGauss` returns a
`HepVector` of values.

#include "CLHEP/RandomObjects/RandMultiGauss.h" class RandMultiGauss : public HepRandomVector

**Constructors**`RandMultiGauss(HepRandomEngine& anEngine, const HepVector& mu, const HepSymMatrix& S)`- The symmetric matrix
`S`*must be positive definite*and*must match the size of*`mu`. `RandMultiGauss(HepRandomEngine* anEngine, const HepVector& mu, const HepSymMatrix& S)`- The symmetric matrix
`S`*must be positive definite*and*must match the size of*`mu`. - These constructors should be used to instantiate a
`RandMultiGauss`distribution object defining a local engine for it. - The static generator will be skipped using the non-static methods defined below.
- If the engine is passed by pointer the corresponding engine object
will be deleted by the
`RandMultiGauss`destructor. - If the engine is passed by reference the corresponding engine object
will not be deleted by the
`RandGauss`destructor. `RandMultiGauss(HepRandomEngine& anEngine)``RandMultiGauss(HepRandomEngine* anEngine)`- These constructors are provided for convenience in the case where each
random fired will have a different mu and
`S`. - They set the default
`mu`to the zero 2-vector, and the default`S`to the Unit 2x2 matrix. **Destructor**`virtual ~RandMultiGauss()`**()**`HepVector operator()()``HepVector operator()(const HepVector& mu, const HepSymMatrix& S )`- The symmetric matrix
`S`*must be positive definite*and*must match the size of*`mu`. **fire**`HepVector fire()``HepVector fire(const HepVector& mu, const HepSymMatrix& S)`- The symmetric matrix
`S`*must be positive definite*and*must match the size of*`mu`. - A note on efficient usage when firing many vectors of Multivariate Gaussians:
- For
*n > 2*the work needed to diagonalize`S`is significant. - So if you only want a collection of uncorrelated Gaussians, it will be
quicker to generate them one at a time.
- The class saves the diagonalizing matrix for the default
`S`. - Thus generating vectors with that same
`S`can be quite efficient. - If you require a small number of different
`S`'s, known in advance, consider instantiating`RandMulitGauss`for each different`S`, sharing the same engine. - If you require a random using the default
`S`for a distribution but a different`mu`, it is most efficient to imply use the default`fire()`and add the difference of the`mu`'s to the returned`HepVector`. **fireArray**`void fireArray(const HepInt size, HepVector* array)``void fireArray(const HepInt size, HepVector* array, const HepVector& mu, const HepSymMatrix& S)`- The symmetric matrix
`S`*must be positive definite*and*must match the size of*`mu`.

EVC