# Create random regular matrix (Matlab)

7 Ansichten (letzte 30 Tage)
high speed am 29 Okt. 2021
Kommentiert: John D'Errico am 30 Okt. 2021
Dear members,
I have the program below, that create a random regular (equal number of ones in each row and column) matrix.
But it works just with small numbers of M*N (dimensions of the matrix). When I try to augment the dimensions for example for 216*432, it runs without stopping.
Can anyone help me to solve the problem please.
clear;clc;
N=12; % Number of columns
M=6; % Number of rows
n=4; % Number of ones in each column
m=2; % Number of ones in each row
a=[ones(1,n),zeros(1,N-n)];
b=a;
c=zeros(M,N);
while ~all(b==m)
for k=1:M
c(k,:)=a(randperm(N));
end
b=sum(c);
end
spy(c)
##### 1 KommentarKeine anzeigenKeine ausblenden
Jan am 30 Okt. 2021
Your code replies a matrix with n ones in each row and m ones in each column, not vice- versa.

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

Jan am 30 Okt. 2021
Bearbeitet: Jan am 30 Okt. 2021
Having m ones in each column and n ones in each row works only, if the the resulting matrix has the size [a*m, a*n].
A constructive approach is more efficient then permuting randomly and checking, if the output meets the conditions. Remember that the number of permutations grows massively with the number of inputs.
Start with a block diagonal matrix and permute the rows and columns randomly:
M = 216; % Number of rows
N = 432; % Number of columns
m = 2; % Number of ones in each row
n = 4; % Number of ones in each column
a = M / m; % Must be N / n
C = kron(eye(a), ones(m, n)); % Block diagonal matrix
C(randperm(M), :) = C;
C(:, randperm(N)) = C;
all(sum(C, 1) == m) && ... % number of ones per column
all(sum(C, 2) == n) % number of ones per row
ans = logical
1
##### 2 Kommentare1 älteren Kommentar anzeigen1 älteren Kommentar ausblenden
John D'Errico am 30 Okt. 2021
Good answer by Jan. An important point to remember is that very frequently, when you know the number of elements you want, but you just don't know the location, a great idea is to start with a non-random solution that satisfies your "goal" and then permute it randomly.

Melden Sie sich an, um zu kommentieren.

### Kategorien

Find more on Logical 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!