我正在尝试为具有 N 个节点的图创建连接矩阵。连接规则规定它应该有 1000 个随机分配的单向连接(节点不能连接到自己)。
我想要做的是在随机位置生成一个矩阵 NxN,其中大部分是零和 1000 个,但不在主对角线上。
我真的对如何实现这一目标没有任何想法。我考虑过生成一个介于 0 和 N/1000 之间的随机数矩阵,然后使 (N-1)/1000 以上的那些为 1,其余为 0,但这不是很精确(我可能会得到更多或更少1000),我不知道如何处理对角线。
我正在尝试为具有 N 个节点的图创建连接矩阵。连接规则规定它应该有 1000 个随机分配的单向连接(节点不能连接到自己)。
我想要做的是在随机位置生成一个矩阵 NxN,其中大部分是零和 1000 个,但不在主对角线上。
我真的对如何实现这一目标没有任何想法。我考虑过生成一个介于 0 和 N/1000 之间的随机数矩阵,然后使 (N-1)/1000 以上的那些为 1,其余为 0,但这不是很精确(我可能会得到更多或更少1000),我不知道如何处理对角线。
那这个呢。查找非对角元素的索引。随机选择其中一些,然后用一个填充这些索引:
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;
如果你想得到一个恰好有 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);
#!/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)