我正在形成连接矩阵,以便我想限制每行中的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)
答案 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;
,......但是它们会引入一些你可能不想要的特殊分布。