How can I generate a binary matrix of permutations

16 views (last 30 days)
Hi, I'd like to ask for help on generating a binary matrix of permutations given several variables:
The first being the number of "ones" per row (n). The second being the length of each row (m). For example, if I was asked to generate a binary matrix given n = 2 and m = 4 the matrix generated should look like the following:
0011
0101
0110
1001
1010
1100
I've been asked to prepare a list of all permutations to select n=23 items out of a list of m=30.
I first thought of generating a matrix of binary numbers incrementing by 1:
0000
0001
0010
0011...
Then going through each row and checking the sum of ones. If that sum equals n then store that row vector in another variable and build my desired matrix that way. This is not efficient though. I am now thinking of something along the lines of this pseudo-code:
for i = 1 to 2^30
x = convert i to binary
if (count of ones in x) = n then y = x
I hope the problem is correctly phrased and I apologies for the simplicity of this question or if it has previously been asked - I'm a complete novice both in Matlab and in using this forum. Your help would be much appreciated.
Greg
  2 Comments
jgg
jgg on 14 Dec 2015
I think it might be easier to do an interative loop.
Start with like (in your example) 1100
Then iterate backwards by "moving" the rightmost-1 to the right.
1100
1010
1001
0110
0101
0011
You should be able to do this by recursion; that's definitely going to be better than try to perform billions of operations.
Greg
Greg on 14 Dec 2015
Agreed. Thanks for getting back to me so quickly jgg. Much appreciated.

Sign in to comment.

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 14 Dec 2015
Edited: Andrei Bobrov on 14 Dec 2015
n = 2;
m = 4;
ii = nchoosek(1:m,n);
k = size(ii,1);
out = zeros(k,m);
out(sub2ind([k,m],(1:k)'*ones(1,n),ii)) = 1;
  4 Comments
DGM
DGM on 27 Dec 2023
Other than a binary array, it's unclear what you're asking for, or if it's even related to this thread.
Given that everyone in this thread has been inactive for at least a year, it's not likely they're going to respond. If you have a question, open a new thread and ask a question. Be clear about what you want. Provide an example of your expected inputs and outputs.
DGM
DGM on 6 Apr 2024 at 2:17
Wow. I've had this tab open for over three months. I'm just going to take a wild stab at answering anyway.
I'm going to interpret this as to say that we want a binary, possibly logical array A of size NxN, where the column vector at column n is a binary representation of 2^n. For sake of plausible convention, I'm assuming a zero-based indexing. Each column vector is ordered LSB first.
N = 8; % the number of columns
A = rot90(dec2bin(2.^(0:N)) == '1')
A = 9x9 logical array
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
This all seems like a sound interpretation of the question, but the fact that this is just
A = eye(N)
A = 8x8
1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
... suggests that:
  • my interpretation was wrong
  • the task was not clearly described
  • the solution was truly trivial
or possibly all of the above.

Sign in to comment.

More Answers (0)

Categories

Find more on Data Type Conversion 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!