在随机位置生成给定数量为1的矩阵

时间:2012-11-23 18:38:34

标签: matlab matrix graph-theory

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

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

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

4 个答案:

答案 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)

  1. 生成随机矩阵 A
  2. 圆形物品
  3. 在主对角线 B 上生成1s矩阵1s(你可以创建矩阵,而不是在主对角线上用1s减去矩阵)
  4. B的多重A

答案 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)