File Exchange

vmrand(fMu, fKappa, varargin)

version 1.3 (4.76 KB) by

Draw random numbers from the Von Mises distribution

Updated

This function uses an envelope-rejection method based on a wrapped Cauchy distribution to draw random variates from an arbitrary Von Mises distribution, first proposed in [1].
'fMu' and 'fKappa' are the mean and variance parameter of the Von Mises distribution over [-pi, pi). 'tVMVariates' will be a tensor containing random variates drawn from the defined distribution. If 'fMu' and 'fKappa' are non-scalar, then they must be the same size. In this case 'tVMVariates' will be the same size. If 'fMu' and 'fKappa' are scalar, then the number of variates returned can be specified as extra arguments.

Example:
vmrand(linspace(-pi, pi, 20), 2); % - Return variates for several distributions, with changing 'fMu'
vmrand(0, 2, [100 1]); % - Return 100 variates (size [100 1]) for the VM distribution with 'fMu' = 0 and 'fKappa' = 2
If only single dimension 'M' is provided, then the return argument 'tfVMVariates' will be M x M.

This implementation is vectorised, and requires O(7.5*N) space.

References:
[1] D. J. Best and N. I. Fisher, 1979. "Efficient Simulation of the von Mises Distribution", Journal of the Royal Statistical Society. Series C (Applied Statistics), Vol. 28, No. 2, pp. 152-157.

Dylan Muir

Dylan Muir (view profile)

Dear Geoffrey and Giorgio,
Thanks, Dylan.

Geoffrey Boynton

Geoffrey Boynton (view profile)

I am having the same experience as Giorgio. I can run vmrand(0,1) multiple times and most often it is fine but occasionally (~10% of times) I get the same error.

Dylan Muir

Dylan Muir (view profile)

Hi Giorgio, What do you mean by "from time to time"? When I run the line of code you quoted I do not receive an error.
Best, Dylan.

Giorgio De Nunzio

Giorgio De Nunzio (view profile)

Hi, Dylan. I also have (from time to time) the problem pointed out by Mr. M.:

>> vmrand(0.5, 1)
Error using .*
Matrix dimensions must agree.

Error in vmrand (line 163)
tfVMVariates(tbDraw & tbAccept) = sign(rand(1, nNumToAccept) - 0.5) .* acos(tfF(tbDraw & tbAccept));

Thanks
Giorgio

Dylan Muir

Dylan Muir (view profile)

Dear Mr M.,
thanks for your feedback. I have updated the code and fixed the bug. Please let me know if you still receive the error.

Best regards,
Dylan.

Mr M.

Mr M. (view profile)

Sometimes I've got the following error:

Error using .*
Matrix dimensions must agree.

Error in vmrand (line 148)
tfVMVariates(tbDraw & tbAccept) = sign(rand(nNumToAccept, 1) - 0.5)
.* acos(tfF(tbDraw & tbAccept));

Mr M.

Mr M. (view profile)

 16 Aug 2017 1.3 Updated description 20 Jul 2017 1.3 Updated description 13 Dec 2016 1.3 Updated description 24 Oct 2016 1.3 Updated description 6 Oct 2016 1.3 Updated description 22 Sep 2016 1.3 Updated usage 28 Apr 2016 1.2 Fixed a bug when no variates were accepted 8 Dec 2014 1.1 Fixed bugs, where providing non-scalar parameters would sometimes cause an error message.
MATLAB Release
MATLAB 7.11 (R2010b)

Play today