1

我正在尝试为具有 N 个节点的图创建连接矩阵。连接规则规定它应该有 1000 个随机分配的单向连接(节点不能连接到自己)。

我想要做的是在随机位置生成一个矩阵 NxN,其中大部分是零和 1000 个,但不在主对角线上。

我真的对如何实现这一目标没有任何想法。我考虑过生成一个介于 0 和 N/1000 之间的随机数矩阵,然后使 (N-1)/1000 以上的那些为 1,其余为 0,但这不是很精确(我可能会得到更多或更少1000),我不知道如何处理对角线。

4

4 回答 4

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;
于 2012-11-23T19:00:55.557 回答
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);
于 2012-11-23T19:00:37.100 回答
0
  1. 生成随机矩阵A
  2. 圆形物品
  3. 在主对角线B上生成 1 和 0 的矩阵(您可以创建一个矩阵,而不是从它的主对角线上减去 1 的矩阵)
  4. 将 A 乘以 B
于 2012-11-23T18:52:52.120 回答
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)
于 2012-11-23T18:57:56.217 回答