我正在尝试为具有N个节点的图形创建连接矩阵。连接规则规定它应该有1000个随机分配的单向连接(节点不能连接到它们自己)。
我想要做的是在随机位置生成一个矩阵NxN,其中大部分为零,有1000个,但不在主对角线上。
我真的对如何实现这一点没有任何想法。我想过生成0到N / 1000之间的随机数矩阵,然后使上面的那些(N-1)/ 1000为1,其余为0,但这不是很精确(我可能会得到更多或更少) 1000)我不知道如何处理对角线。
答案 0 :(得分:2)
这个怎么样?找到非对角元素的索引。随机选择其中一些,然后使用那些索引填充这些索引:
nn = 10; % Size of matrix
nr = 20; % number of random connections
ident = eye(nn);
nd_idx = find(~ident); % Indices of non-diag elements
con = randperm(numel(nd_idx), nr); % Pick random elements
m = zeros(nn);
m( nd_idx(con) ) = 1;
答案 1 :(得分:1)
如果你想得到一个矩阵,其中包含1000个随机定位的真值,我的建议是创建一个随机矩阵,并使用最低或最高的1000个元素。要删除对角线,请使用eye()
。所以,像这样
N = 5000;
nNodes = 1000;
a = rand (N);
a(eye (N)) = 2;
threshold = sort (a(:))(nNodes);
b = false (N);
b(a >= threshold) = true;
我认为Matlab还没有实现变量输出的索引,这仍然只在Octave中可用。如果是这种情况,您将需要使用临时变量来保存已排序的数组,这可以为大型矩阵占用一些内存。
threshold = sort (a(:));
threshold = threshold(nNodes);
答案 2 :(得分:0)
答案 3 :(得分:0)
#!/usr/bin/python
import sys
from random import randint
if len(sys.argv)!=3:
sys.exit("usage is :"+sys.argv[0]+" matrix-size num-of-connections")
matrixSize = int(sys.argv[1])
numOfConnections = int(sys.argv[2])
i = 0
while (i < numOfConnections):
a = randint(1, matrixSize)
b = randint(1, matrixSize)
if (a==b):
continue
i+=1
print "connection from %d to %d"%(a,b)