【发布时间】:2015-02-10 12:15:51
【问题描述】:
我有一点技术问题,但我觉得使用 MATLAB 强大的工具集应该可以解决。
我所拥有的是一个由 0 和 w 组成的随机 n × n 矩阵,比如使用生成的
A=w*(rand(n,n)<p);
w 的典型值是 3000,但这并不重要。
现在,这个矩阵有两个重要的量,向量
c = sum(A,1);
r = sum(A,2)';
这是两个行向量,第一个表示每列的总和,第二个表示每行的总和。
接下来我要做的是随机化 w 的每个值,例如在 0.5 和 2 之间。我会这样做
rand_M = (0.5-2).*rand(n,n) + 0.5
A_rand = rand_M.*A;
但是,我不想只选择这些随机数:我希望它们对于每一列和每一行来说,总和仍然等于 c 和 r 的元素。所以要稍微清理一下符号,比如说我们定义
A_rand_c = sum(A_rand,1);
A_rand_r = sum(A_rand,2)';
我希望所有j = 1:n, A_rand_c(j) = c(j) 和A_rand_r(j) = r(j) 都使用它。
我正在寻找的是一种以某种算法方式重绘 rand_M 元素的方法,我认为,以便最终满足这些要求。
当然,除非我有无限的时间,否则这可能不会真正发生。因此,我接受这些数量属于特定范围:A_rand_c(j) 必须是 [(1-e)*c(j),(1+e)*c(j)] 和 A_rand_r(j) 的 [(1-e)*r(j),(1+e)*r(j)] 的一个元素。我预先定义了这个 e,比如 0.001 之类的。
在寻找方法的过程中,有人可以帮助我吗?我尝试了一种方法,我只是随机重新选择数字,但这真的没有让我到任何地方。它也不必非常高效,我只需要它在有限的时间内为大小的网络工作,比如 n = 50。
需要明确的是,最终输出是满足这些约束的矩阵A_rand。
编辑:
好吧,经过一番思考,我想它可能可以通过一些 while 语句来实现,它会遍历矩阵的每个元素。困难的部分是有四种可能性:如果您在特定元素A_rand(i,j) 中,则可能是A_rand_c(j) 和A_rand_r(i) 都太小、都太大或相反。前两种情况很好,因为这样你就可以重新绘制随机数,直到它小于当前值并改善这种情况。但是另外两种情况是有问题的,因为你会改善一种情况而不是另一种。我想它必须查看哪些标准不太满足,以便尝试修复更糟糕的标准。但这并不是微不足道的..
【问题讨论】:
-
我看到您使用的是
rand而不是randn。随机值可以是正态分布吗? -
嗯,是的,原则上可以。 Uniform 有轻微的偏好,但无论如何,在进行了所有更改之后,它们不会是真正的统一。
-
要随机化,同时保持每行(或每列)的总和,您可以使用this 的小变化。保持行 和 列的总和似乎要困难得多。我假设你想要一个 uniform 随机分布
-
如果我理解正确的话,你不能只生成一个介于 0 和 min(c,r) 之间的随机数,称之为 x0。然后生成一个介于 0 和 min(c,r)-x0 之间的随机数,称为 x1。然后生成一个介于 0 和 min(c,r)-x0-x1 之间的随机数,称为 x2。以此类推。
-
@LuisMendo 我的意图是让它大致一致,是的。我知道这很难做到,所以如果数字有点偏斜也没关系,但原则上它们应该在给定范围内保持一致。您提到的帖子确实对单个专栏有意义,但遗憾的是这不是我需要的:(
标签: arrays matlab random probability