如何生成每行中 1 的数量有限的随机对称 0-1 矩阵

How to generate random symmetric 0-1 matrices with a limited number of 1's in each row

我正在形成一个连接矩阵,因此我想限制每行中 1 的数量。例如,如果输入大小为 15、30、80、100,则最高连接度应限制为 6、8、8、9。条件是 i) 每行至少应有一个 1,ii) 对角线应该是 0 和 iii) 矩阵应该是 symmetric.I 已经尝试过这个代码但是当输入大小变大时它不限制那些。

  m = input('No. OF ROWS AND COLUMNS : ');
  P = rand(m,m); %// generate random numbers in [0,1]
  p=0.4;
  result = rand(m,m)<p; %// generate matrix
  result(bsxfun(@plus, floor(m*rand(1,m))*m, 1:m)) = 1;
  for i=1:m
   for j=1:m
     result(j,i)=result(i,j);
   end
  end
  result(logical(eye(size(result)))) = 0
  A=sum(result)

一个重要的考虑是你想要一个随机矩阵;否则,只需在对角线上方和下方放置 1 就足够了。在谈论随机事物时,人们通常会想到一些分布,但您没有指定任何分布。

您使用 p = 0.4 作为任何条目中出现 1 的概率。对于输入大小 n,这将导致每行中大约有 0.4*n 个条目(多一些,少一些)。显然,对于 n=100,如果您希望每行最多 9 个,这就太多了。

这里有一种调整概率的方法:如果1的数量太多,就把它变小,然后重复。对于您列出的尺寸,这相当快。

success = 0;
n = 100;     % size of matrix
k = 9;       % maximal number of 1s
p = 0.5;
A = zeros(n,n);

while (success == 0)
  A = (rand(n,n) < p);
  A(logical(eye(n))) = 0;
  A = max(A, A');
  s = sum(A,1);
  success = 1;
  if min(s) == 0
     success = 0; p = p*2;   % too few 1s, increase p
  end
  if max(s) > k
     success = 0; p = p/2;   % too many 1s, decrease p 
  end
end
disp(A)

上述方法提供了高质量的随机矩阵,条目中没有特定的模式。

还有其他方法,比如重复命令

A(1:n, randperm(n)) = 1;

几次,然后按上面的方式进行:A = max(A,A'); A(logical(eye(n)))=0;,...但是它们引入了一些您可能不想要的 1 的特殊分布。