# Change matrix bits depending on the rate (Matlab)

1 view (last 30 days)

Show older comments

Dear members

I have matrix A of dimensions s1*s2 where the number of ones in each column and row is equal

And I have to write a program that verify if the final bits depending on the rate are 0 or 1. If final bits depending on the rate is 0, I have to make permutation between rows and columns in order to obtain final bits 1 not 0 and save the equal number of ones in each row and column.

For example : I have a matrix 5*10, so the rate is 5/10=1/2 and the number of ones in each row is 6 and in each column is 3

The final bit depending on the rate 1/2 in the first row is 0, so here I have to make permutation between rows and columns to obtain 1 in place of 0 and the number of ones in each row and columns still the same. We obtain this matrix finally :

I tried to program the first part that calcul the rate of the matrix like that:

[s1, s2] = size(A);

d = gcd(s1, s2);

n1 = s1 / d;

n2 = s2 / d;

Can you help me to program the permutation please.

##### 4 Comments

Jan
on 21 May 2021

### Accepted Answer

AMO
on 21 May 2021

Edited: AMO
on 21 May 2021

[s1, s2] = size(A);

d = gcd(s1, s2);

n1 = s1 / d;

n2 = s2 / d;

% rows and columns of final bits

rows = 1:s1;

cols = zeros(1,s1);

cOffset = 0;

for c = n2:n2:s2

cols((1:n1) + cOffset) = c;

cOffset = cOffset + n1;

end

% linear index of final bits

finalBits = sub2ind([s1,s2], rows, cols);

% untill all final bits are 1s

while any(A(finalBits) == 0)

% randomly select to swap either rows or colmns

if randi(2) == 1

% swap rows

rswap = randperm(s1,2);

A(rswap,:) = A(flip(rswap),:);

else

% swap columns

cswap = randperm(s2,2);

A(:,cswap) = A(:, flip(cswap));

end

end

##### 13 Comments

### More Answers (0)

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!