Create random regular matrix (Matlab)
13 次查看(过去 30 天)
显示 更早的评论
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 个评论
Jan
2021-10-30
Your code replies a matrix with n ones in each row and m ones in each column, not vice- versa.
采纳的回答
Jan
2021-10-30
编辑:Jan
2021-10-30
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 个评论
John D'Errico
2021-10-30
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.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Operating on Diagonal Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!