Skip to content Skip to sidebar Skip to footer

2d Bit Matrix With Every Possible Combination

I need to create a python generator which yields every possible combination of a 2D bit matrix. The length of each dimention is variable. So for a 2x2 matrix: 1. 00 00 2. 10 00 3.

Solution 1:

Going through all possible values of a bit vector of a given size is exactly what a counter does. It's not evident from your question what order you want, but it looks much like a Gray counter. Example:

from sys import stdout

w,h=2,2for val in range(2**(w+h)):
    gray=val^(val>>1)
    for y in range(h):
        for x in range(w):
            stdout.write('1'if gray & (1<<(w*y+x)) else'0')
        stdout.write('\n')
    stdout.write('\n')

Note that the dimensions of the vector don't matter to the counter, only the size. Also, while this gives every static pattern, it does not cover all possible transitions.

Solution 2:

This can be done using permutation from itertools in the following way.

import itertools
dim=2
dimension = dim*dim
data = [0for i inrange(0,dimension)] + [1for i inrange(0,dimension)]
count = 1for matrix inset(itertools.permutations(data,dimension)):
    print('\n',count,'.')
    for i inrange(0,dimension,dim):
        print(' '.join(map(str,matrix[i:i+dim])))
    count+=1

P.S: This will be good for 2X2 matrix but a little bit time consuming and memory consuming for higher order. I would be glad if some one provides the less expensive algorithms for this.

Solution 3:

You can generate every possibility of length 2 by using every number from 0 to 4(2 to the power of 2).

0->001->012->103->11

For the displaying part of a number as binary, bin function can be used.

Since you have 2x2 matrix, you need 2 numbers(i and j), each for a row. Then you can just convert these numbers to binary and print them.

for i in range(4):
    for j in range(4):
        row1 = bin(i)[2:].zfill(2)
        row2 = bin(j)[2:].zfill(2)

        print row1, "\n" , row2, "\n"

EDIT:

I have found zfill function which fills a string with zeros to make it fixed length.

>>> '1'.zfill(5)
'00001'

Another generic solution might be:

import re

dim1 = 2
dim2 = 2
n = dim1 * dim2
i = 0 
limit = 2**n
while i < limit:
    print'\n'.join(re.findall('.'*dim2, bin(i)[2:].zfill(n))), '\n'
    i += 1

Solution 4:

you could do something like this for 3x3 binary matrix:

for i in range(pow(2,9)):
    p = '{0:09b}'.format(i)
    print(p)
    x = []
    x.append([p[0],p[1],p[2]])
    x.append([p[3],p[4],p[5]])
    x.append([p[6],p[7],p[8]])
    for i in range(3):
        x[i] = map(int, x[i])

Post a Comment for "2d Bit Matrix With Every Possible Combination"