Generate Random Matrix 0's,1's
    14 views (last 30 days)
  
       Show older comments
    
    Mohammad Al ja'idi
 on 13 Jun 2019
  
    
    
    
    
    Commented: Mohammad Al ja'idi
 on 14 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]
4 Comments
  John D'Errico
      
      
 on 13 Jun 2019
				
      Edited: John D'Errico
      
      
 on 13 Jun 2019
  
			I MIGHT answer, except your question is inconsistent. Are you looking for random matrices, or ALL POSSIBILITIES? You say both, in different places.
Note that there are m^n possible such matrices, given a matrix sixze of n rows, m columns. Do you want to create all of them? or only some, at random?
Accepted Answer
  John D'Errico
      
      
 on 13 Jun 2019
        
      Edited: John D'Errico
      
      
 on 13 Jun 2019
  
      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.
More Answers (1)
  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.
5 Comments
See Also
Categories
				Find more on Creating and Concatenating Matrices in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!