我有一个与此类似的问题: Weighted random numbers in MATLAB
此时,我在程序中使用randsample,如下所示:
T = [0 .5 .5; .5 0 .5; .5 .5 0]
choices = 1:3
for i = 1:3
t(i) = transpose(randsample(choices,1,true,T(i,:)));
end
因此t(i)
为每个人描述了他们将选择哪个邻居。
我的T
矩阵,当逐行读取时描述了一个人选择邻居的概率。例如,第一行表示第一个人将选择节点2或3,每个概率为50%。他们无法选择自己的节点1.当我扩展我的模型时,他们总是有相同的选择邻居的概率,1 /邻居的数量。为了简洁起见,我在这里硬编码了T矩阵。
我尝试使用链接主题中建议的histc
,但由于我的0
矩阵的每一行总是有T
,所以我不认为累积和精确设置中间为0的行的bin(此处为T
的第二行)。
我也尝试使用bsxfun
,当我单独查看T
矩阵的每一行时,我能够获得灵敏的输出,但我没有把它放在一个循环中。我觉得解决方案可能就在这里,但我不确定我是否完全理解这个功能在我的上下文中是如何运作的。
那么,有没有人对如何加速我的randsample函数有任何想法?目前,我迭代它10000x,所以它是我程序中的一个主要瓶颈。它的工作原理我需要它,它太慢了。
答案 0 :(得分:1)
因此,您希望每个人都能以一致的概率在所有其他人中挑选邻居。
我会这样做。它应该很快。
n = 7; %// number of persons
t = ceil((n-1)*rand(1,n)); %// step 1
t = t + (t>=(1:n)); %// step 2
对于每个k
,从{t(k)
,1
,...,2
,{{1}中随机挑选生成的k-1
具有均匀分布的},...,k+1
}。为此,使用了两个步骤:
n
,...,1
}; n-1
,则会增加k
。