**Info**

This question is closed. Reopen it to edit or answer.

# rand matrix for FM

1 view (last 30 days)

Show older comments

Hi all,I want to generate a random matrix so that the sum of all the elements is zero. I mean the random numbers are so selected that the total sum of the matrix goes to zero.Regards. Early reply will be highly appreciated.

for example

a = rand(3)

a =

0.3000 0.5000 0.8000

-0.1000 -0.4000 -0.6000

-0.4000 0.8000 -0.9000

>> sum(sum(a))

ans =

0

##### 2 Comments

### Answers (3)

Roger Stafford
on 31 Mar 2015

Edited: James Tursa
on 1 Apr 2015

If your x values are subject to common upper and lower bounds, you can use my 'randfixedsum' function in the File Exchange, located at:

It is designed to give a uniform distribution on the hyperplane of values satisfying the condition of a predetermined sum - in your case a sum of zero.

##### 1 Comment

Zoltán Csáti
on 31 Mar 2015

I recommend you to generate the matrix of the required size and then modify one element of it so that the sum holds. E.g.

A = rand(3);

totalSum = sum(sum(A));

A(end,end) = A(end,end) - totalSum;

Then the sum will give you zero, aside from the round-off error.

##### 2 Comments

John D'Errico
on 31 Mar 2015

Edited: John D'Errico
on 31 Mar 2015

It depends on how you want the elements themselves to be distributed. See that if they should originally be bounded in the interval [-1,1], then by the final shift, they often will no long be so bounded.

For example...

A = rand(3) *2 - 1;

A = A - sum(A(:))/numel(A)

A =

0.53571 -0.78404 0.51328

-0.81271 -0.68212 -0.24218

-0.32253 0.77053 1.0241

sum(A(:))

ans =

-2.2204e-16

See that while the sum is now zero, that now one of the elements actually exceeded 1, even though the original elements fell inside [-1,1].

Brendan Hamm
on 31 Mar 2015

How about you create a random matrix and then subtract from each element the sum(matrix(:))/numel(matrix).

n = 4;

A = rand(4);

s = sum(A(:))/numel(A);

A = A - s;

sum(A(:))

##### 5 Comments

Roger Stafford
on 1 Apr 2015

Brendan Hamm
on 1 Apr 2015

They are currently U([-c c]) where c i s the sum of the originally sampled elements divided by the number of elements. You want them to be U([-1 1]), then just divide by the magnitude of the largest resulting element now:

A = A / max(abs(A(:)));

This question is closed.

### See Also

### Products

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!