3 views (last 30 days)

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

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.

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.

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(:))

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(:)));

Opportunities for recent engineering grads.

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

Start Hunting!
## 2 Comments

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/195476-rand-matrix-for-fm#comment_275758

⋮## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/195476-rand-matrix-for-fm#comment_275758

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/195476-rand-matrix-for-fm#comment_275838

⋮## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/195476-rand-matrix-for-fm#comment_275838

Sign in to comment.