Create random regular matrix (Matlab)
13 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentar
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.
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
2 Kommentare
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.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Operating on Diagonal Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!