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

时间:2016-03-18 03:29:38

标签: matlab matrix connectivity

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

  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 个答案:

答案 0 :(得分:1)

一个重要的考虑因素是你想要一个随机矩阵;否则,只需在对角线上方和下方放置1即可。在谈论随机事物时,通常会记住一些分布,但你没有指定任何分布。

您使用p = 0.4作为任何条目中1的概率。使用输入大小n,这将导致每行中大约0.4 * n个条目(一些更多,一些更少)。显然,如果你想要每行最多9个,那么n = 100就太多了。

以下是调整概率的一种方法:如果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;,......但是它们会引入一些你可能不想要的特殊分布。