Randomize a matrix

--please have a look at my third post in this thread! there I explained it more clearly--

Hey guys.

I posted a complex problem few days back. No reply! :expressionless:
Here is simplified question:

I have a matrix with 0/1:

*        col1  col2  col3
row1    1      0      1
row2    0      0      1
row3    1      1      1
row4    1      0      0

I wanna randomize it 1000 times (or even more!) and have matrices with the same sum for each row and column as it is in input file.

Any ideas?

Thanks

This is probably not as easy as it sounds. You only have 0 and 1 as elements and a fixed number of 1s in every row and column as a further limiting factors. The number of possible permutations is well below 1000 - for a single 4-element field for example it is:

4 with 1 1-field
6 with 2 1-fields
4 with 3 1-fields
1 with 4 1-fields

This is probably solvable with the same sort of algorithm as the "8-queens-problem" (for which there are also only 96 distinct solutions and even of these 3/4 of them are axial- and/or mirror-symmetrical variants).

I hope this helps.

bakunin

To solve this, you need to find

1  0
0  1

submatrices which you can permute so not to break your constant-row-and-col-sum side condition. I can see one single of these (on first sight):

0  1
1  0

in row 2 & 4, col 1 & 3. No chance for 1000 permutations...

@Rudic: The actual input data that I have is much bigger than this! It might be possible to have 1000 permutations.
Actually my worries is if it's possible to do this simulation and repeat it million times for instance. If it does not make sense I have no other choice rather than disregarding the similarity for sum of each rows and just check for similar sums for each column.

@bakunin: the difference between this problem and "8-queens-problem" is that first: in 8-queens there is just one position for each row and column to have value '1', but here it's more and varies. Second: Here we take those variants which are symmetrical or mirror as well since each column has different meaning.

What do you need? distinct eignevectors, eigenvalues, or columns && rows?

What kinds of matrix operations do you need to perform - more specifically what the heck are you trying to do? Please -NOT- how you think you should do it? We can see that, sort of.

Why did I say this? Because up to now this looks rather off-the-wall, i.e., squaring the circle. ...to be polite.

You are damn right Jim! :slight_smile: I like how you described it... cool!! :wink:
I found an algorithm how to randomize my -rather complex to explain- data.

I explain it here:

Suppose I have the following input file:

*	A	B	C	D	E
reg1	1	0	1	1	0
reg2	0	1	0	0	1
reg3	1	0	0	1	0
reg4	0	0	1	0	1
reg5	1	1	0	0	1

First of all I would like to store it in a hash or 2 dimensional array which is like this:

A	rand#
A	rand#
A	rand#
B	rand#
B	rand#
C	rand#
C	rand#
D	rand#
D	rand#
E	rand#
E	rand#
E	rand#

As you can see the first column represents as many as headers that we had value '1' for them in input file. Second column is just a random number between 0-1.

Then we initiate an empty matrix with the same size as input file and start filling it with respect to previous table contained headers and random numbers.

The script should first sort the above table by the numbers (2nd column). therefore in each iteration we gonna have random order for headers in first column. Additionally, for each header a value '1' should be located in the corresponding column in our empty table.

to make sure that we don't make a mistake, each time that we take a header a value of 1 should be added to that row (in an additional third column). next time when we want to pick another header, we check the value in third column. If it was 1 we skip it since we know that it has been taken.
This goes repeatedly until the sum of the first row in our recently empty table turns equal to sum of the first row in input file. Then it goes to the second row and continue filling the rows until we have used all the headers.

if this can be solved then I can move on.

Thanks.