# How to create a random binary matrix with equal number of ones in each column?

8 views (last 30 days)

Show older comments

Hi All,

I want to create a random binary matrix with equal number of ones in each column.

Appreciate if anyone have an idea to implement this in Matlab.

Thanks.

##### 1 Comment

the cyclist
on 2 Nov 2011

### Accepted Answer

Image Analyst
on 2 Nov 2011

This is how I did it:

% Set up parameters.

rows = 10;

columns = 15;

onesPerColumn = 4;

% Initialize matrix.

m = zeros(rows, columns, 'int32')

for col = 1 : columns

% Get random order of rows.

randRows = randperm(rows);

% Pick out "onesPerColumn" rows that will be set to 1.

rowsWithOne = randRows(1:onesPerColumn);

% Set those rows only to 1 for this column.

m(rowsWithOne, col) = 1;

end

% Display m

m

##### 3 Comments

### More Answers (4)

Sven
on 2 Nov 2011

Try:

% Define your matrix size and randomly pick the number of ones

matSz = [20, 40];

numOnes = randi(matSz(1));

% Make your matrix

myMat = false(matSz);

for i = 1:matSz(2)

myMat(randperm(matSz(1),numOnes), i) = true;

end

% Check that all went as planned

sum(myMat,1)==numOnes

##### 2 Comments

Sven
on 2 Nov 2011

Really? The variable "myMat" is your answer. The last line that prints out a series of ones was just confirmation that all of your columns had "numOnes" true elements in them.

Setting

matSz = [10, 15];

and

numOnes = 4;

gives the exact same output as what you agreed with below.

Naz
on 2 Nov 2011

Since it's a RANDOM matrix, you are not guaranteed to have the same amount of one's and zero's (at least it seems logical to me). In order to get about 1/2 probability you need large matrix. You can try this:

a=rand(1000,1000);

a=round(a);

Check out help file for rand vs. randn

##### 0 Comments

Walter Roberson
on 2 Nov 2011

Anne, you need to define what it means to take an inverse for you binary matrix. You can treat the binary matrix as being composed of the real numbers 0 and 1 and then do an arithmetic inverse on the array, ending up with a non-binary array. Or you can treat the binary matrix as being composed of boolean values over a field with the '*' being equivalent to 'or' and '+' being equivalent to xor, and the task is then to find a second binary matrix such that matrix multiplication using those operations produces the identity matrix.

If you want the inverse to be a binary matrix instead of a real-valued matrix, please see this earlier Question:

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!