我遇到了一些技术问题,但我觉得使用 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)
and A_rand_r(j) = r(j)
.
我正在寻找一种以我认为的算法方式重新绘制 rand_M 元素的方法,以便最终满足这些要求。
当然,除非我有无限的时间,否则这可能不会真正发生。因此,我接受这些数量属于特定范围:A_rand_c(j)
必须是一个元素[(1-e)*c(j),(1+e)*c(j)]
and A_rand_r(j)
of [(1-e)*r(j),(1+e)*r(j)]
。这个 e 我事先定义了,比如说 0.001 之类的。
在寻找方法的过程中有人能够帮助我吗?我尝试过一种随机重新选择数字的方法,但这确实没有任何帮助。它也不必非常高效,我只需要它能够在有限的时间内为规模较大的网络(例如 n = 50)工作。
需要明确的是,最终的输出是矩阵A_rand
满足这些约束条件。
编辑:
好吧,经过一番思考,我想用一些 while 语句来遍历矩阵的每个元素可能是可行的。困难的部分是有四种可能性:如果你处于特定元素A_rand(i,j)
,可能是这样A_rand_c(j)
and A_rand_r(i)
都太小、都太大或相反。前两种情况很好,因为这样你就可以重新绘制随机数,直到它小于当前值并改善情况。但另外两种情况是有问题的,因为你会改善一种情况,但不会改善另一种情况。我想它必须看看哪些标准不太满足,以便它尝试修复更糟糕的标准。但这不是微不足道的,我想说..