# Generate matrix of a random process with each row using different parameters and no for-loop

1 view (last 30 days)
Daniel Kellett on 7 Jun 2016
Commented: Daniel Kellett on 7 Jun 2016
For example, suppose I want to generate 5 different normally distributed vectors with 10 samples each. The first vector will have a mu = 0, sigma = 1, the second a mu = 5, sigma = 3, etc. What I would like to be able to do would be something like the following code:
mu = [0, 3, 2, 5, 1]; sigma = [1, 5, 4, 10, 7]; myDistributions = random('norm', mu, sigma, [5, 10]);
and have it output a 5-by-10 matrix with the first row using parameters mu = 0, sigma = 1; the second row using parameters mu = 3, sigma = 5. etc.
I suspect I'll have to bite the bullet and just use a for-loop if I want to do this, but I'm hoping I've missed something else that can be done for this sort of thing.

Brendan Hamm on 7 Jun 2016
You can use arrayfun for this:
mu = [0, 3, 2, 5, 1];
sigma = [1, 5, 4, 10, 7];
A = arrayfun(@(x,y) random('norm', x, y, [1, 10]),mu,sigma,'UniformOutput',false)
% Change from a cell to a matrix:
A = cell2mat(A);
Daniel Kellett on 7 Jun 2016
This was a quicker answer than I expected. Works quite well, and seems I will need to be re-visiting arrayfun and its uses. Thanks!

### More Answers (1)

Jos (10584) on 7 Jun 2016
mu = [0, 3, 2, 5, 1]
sigma = [1, 5, 4, 10, 7]
MyDistributions = cell2mat(arrayfun(@(k) random('norm', mu(k), sigma(k), [1, 10]),(1:numel(mu))','un',0))
Daniel Kellett on 7 Jun 2016
Hmm, I have certainly been overlooking arrayfun for a number of things it seems. This is very helpful! (However, I am accepting Brendan Hamm's answer since it was easier to read and understand at a glance.)