Asked by Mohammad Al ja'idi
on 13 Jun 2019

clould you please assist me to solve the following question:

I need to get random of (0,1) matrices with size (n*m) with the following constraints:

- Each row has only one (1) and the other values are (0's)

as in the following example:

Example :: for matrix (3*2) as we see we have only one (1) in each row and the other columns are 0's

[1 0 0

1 0 0]

---------

[1 0 0

0 1 0]

---------

[1 0 0

0 0 1]

--------

[0 1 0

1 0 0]

----------

[0 1 0

0 1 0]

---------

[0 1 0

0 0 1]

--------

[0 0 1

1 0 0]

--------

[0 0 1

0 1 0]

--------

[0 0 1

0 0 1]

Answer by John D'Errico
on 13 Jun 2019

Edited by John D'Errico
on 13 Jun 2019

Accepted Answer

Easy enough.

matno = 10; % the number of random possiblities

rows=10;

columns=3;

Now we want to create a matrix of size (rows,columns,matno), such that each row has exactly one element that is 1, and the placement of that 1 is random. This is most simply done by creating a matrix of size (matno*rows,columns), where each of those rows has exactly one true element.

The location of those 1's will be:

cloc = randi(columns,[matno*rows,1]);

matrices = zeros(matno*rows,columns);

matrices(sub2ind([matno*rows,columns],(1:(matno*rows))',cloc)) = 1;

matrices = permute(reshape(matrices,matno,rows,columns),[2 3 1]);

matrices

matrices(:,:,1) =

0 0 1

0 0 1

1 0 0

0 1 0

0 1 0

1 0 0

1 0 0

0 0 1

0 0 1

1 0 0

matrices(:,:,2) =

0 1 0

1 0 0

1 0 0

0 0 1

1 0 0

0 0 1

1 0 0

0 1 0

1 0 0

0 0 1

matrices(:,:,3) =

1 0 0

1 0 0

1 0 0

0 1 0

0 1 0

1 0 0

1 0 0

0 1 0

0 0 1

1 0 0

matrices(:,:,4) =

0 1 0

0 0 1

0 1 0

0 1 0

0 0 1

0 0 1

0 1 0

0 1 0

0 1 0

1 0 0

matrices(:,:,5) =

1 0 0

1 0 0

0 1 0

0 0 1

1 0 0

1 0 0

0 0 1

0 1 0

0 1 0

0 1 0

matrices(:,:,6) =

0 0 1

0 0 1

1 0 0

1 0 0

0 0 1

0 1 0

0 1 0

1 0 0

0 0 1

0 1 0

matrices(:,:,7) =

1 0 0

0 0 1

1 0 0

0 1 0

0 0 1

1 0 0

0 0 1

0 0 1

0 1 0

1 0 0

matrices(:,:,8) =

0 0 1

1 0 0

0 1 0

0 0 1

1 0 0

0 1 0

1 0 0

0 1 0

0 1 0

0 0 1

matrices(:,:,9) =

0 0 1

1 0 0

0 0 1

1 0 0

1 0 0

0 1 0

0 1 0

0 0 1

0 0 1

1 0 0

matrices(:,:,10) =

1 0 0

1 0 0

1 0 0

0 0 1

0 1 0

0 1 0

1 0 0

0 1 0

1 0 0

0 1 0

Easy. Almost trivial. To prove that the result has exactly one 1 in each row, this next result should be a 10x10 array of 1's.

squeeze(sum(matrices,2))

ans =

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

As it is.

Mohammad Al ja'idi
on 14 Jun 2019

Great .. thank you so much

madhan ravi
on 14 Jun 2019

+1

Sign in to comment.

Answer by Guillaume
on 13 Jun 2019

Note that a 3x2 is a matrix with 3 rows and 2 columns, not the other way round.

Bearing in mind that there are n^m such matrices of size m x n, which will quickly get out of hand as n and particularly m grows, here is one way:

m = 4; %number of ROWS. demo data

n = 5; %number of COLUMNS. demo data

columns = cell(1, m); %1 x m array to store all possible column combinations

[columns{:}] = ndgrid(1:n); %cartesian product of 1:n across all rows

columns = cat(m+1, columns{:}); %store as one matrix

pages = repmat(1:n^m, 1, m); %matching page for each element of columns

rows = repelem(1:m, n^m); %matching row for each element of columns

result = zeros(m, n, n^m); %destination matrix

result(sub2ind(size(result), rows(:), columns(:), pages(:))) = 1;

result is a m x n x (n^m) matrix where result(:, :, p) is one of your desired matrix.

Note that you could use Matt J's ndSparse function to build a sparse matrix (using the same rows(:), columns(:), pages(:) arguments) instead of a full matrix. It would be a lot more memory efficient.

Mohammad Al ja'idi
on 14 Jun 2019

great thank you so much

madhan ravi
on 14 Jun 2019

+1

Mohammad Al ja'idi
on 14 Jun 2019

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 4 Comments

## KALYAN ACHARJYA (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/466943-generate-random-matrix-0-s-1-s#comment_714439

## Mohammad Al ja'idi (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/466943-generate-random-matrix-0-s-1-s#comment_714448

## John D'Errico (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/466943-generate-random-matrix-0-s-1-s#comment_714474

## Mohammad Al ja'idi (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/466943-generate-random-matrix-0-s-1-s#comment_714476

Sign in to comment.