【发布时间】:2016-08-12 03:08:32
【问题描述】:
我正在寻找一种方法来快速创建具有以下属性的随机矩阵A:
A = transpose(A)-
A(i,i) = 0为所有我 -
A(i,j) >= 0代表所有 i, j -
sum(A) =~ degree;行的总和由我要指定的分布随机分布(这里=~表示近似相等)。
分布degree来自矩阵orig,特别是degree=sum(orig),因此我知道存在这种分布的矩阵。
例如:orig=[0 12 7 5; 12 0 1 9; 7 1 0 3; 5 9 3 0]
orig =
0 12 7 5
12 0 1 9
7 1 0 3
5 9 3 0
sum(orig)=[24 22 11 17];
现在一个可能的矩阵A=[0 11 5 8, 11 0 4 7, 5 4 0 2, 8 7 2 0] 是
A =
0 11 5 8
11 0 4 7
5 4 0 2
8 7 2 0
sum(A)=[24 22 11 17].
我尝试了很长一段时间,但不幸的是我的两个想法都没有奏效:
版本 1:
我切换Nswitch 次两个随机元素:A(k1,k3)--; A(k1,k4)++; A(k2,k3)++; A(k2,k4)--;(以及转置的元素)。
不幸的是,Nswitch = log(E)*E(与E=sum(sum(nn)))是为了使矩阵非常不相关。作为我的E > 5.000.000,这是不可行的(特别是因为我需要至少 10 个这样的矩阵)。
第 2 版:
我根据分布从头开始创建矩阵。这个想法是,根据degree 的分布,用degree(i) 数字填充每一行i:
nn=orig;
nnR=zeros(size(nn));
for i=1:length(nn)
degree=sum(nn);
howmany=degree(i);
degree(i)=0;
full=rld_cumsum(degree,1:length(degree));
rr=randi(length(full),[1,howmany]);
ff=full(rr);
xx=i*ones([1,length(ff)]);
nnR = nnR + accumarray([xx(:),ff(:)],1,size(nnR));
end
A=nnR;
但是,虽然sum(A')=degree、sum(A) 系统地偏离了degree,但我无法找到原因。
与degree 的小偏差当然是可以的,但在某些地方包含大量数字的矩阵中似乎存在系统偏差。
如果有人可以向我展示版本 1 的快速方法,或者版本 2 中分布的系统偏差的原因,或者以不同方式创建此类矩阵的方法,我将非常高兴。谢谢!
编辑:
这是 matsmath 提出的解决方案中的问题: 想象一下你有一个矩阵:
orig =
0 12 3 1
12 0 1 9
3 1 0 3
1 9 3 0
r(i)=[16 22 7 13].
- 第 1 步:r(1)=16,我的随机整数分区是 p(i)=[0 7 3 6]。
- 第 2 步:检查所有 p(i)
- 第三步:
我的随机矩阵开始看起来像
A =
0 7 3 6
7 0 . .
3 . 0 .
6 . . 0
使用新的行和向量 rnew=[r(2)-p(2),...,r(n)-p(n)]=[15 4 7]
第二次迭代(这里出现问题):
- 第一步:rnew(1)=15,我的随机整数分区是p(i)=[0 A B]:rnew(1)=15=A+B。
- 第 2 步:检查所有 p(i)矛盾 :-/
编辑2:
这是代表(据我所知)David Eisenstat 发布的解决方案的代码:
orig=[0 12 3 1; 12 0 1 9; 3 1 0 3; 1 9 3 0];
w=[2.2406 4.6334 0.8174 1.6902];
xfull=zeros(4);
for ii=1:1000
rndmat=[poissrnd(w(1),1,4); poissrnd(w(2),1,4); poissrnd(w(3),1,4); poissrnd(w(4),1,4)];
kkk=rndmat.*(ones(4)-eye(4)); % remove diagonal
hhh=sum(sum(orig))/sum(sum(kkk))*kkk; % normalisation
xfull=xfull+hhh;
end
xf=xfull/ii;
disp(sum(orig)); % gives [16 22 7 13]
disp(sum(xf)); % gives [14.8337 9.6171 18.0627 15.4865] (obvious systematic problem)
disp(sum(xf')) % gives [13.5230 28.8452 4.9635 10.6683] (which is also systematically different from [16, 22, 7, 13]
【问题讨论】:
-
sum(A) =~ degree是否意味着您希望sum(A)是degree的排列,或者这是近似相等? -
对不起,它的意思是“近似相等”。
-
矩阵是否固定为 4x4?或者您是否需要针对所有矩阵尺寸的解决方案?
-
它应该适用于任意大小,我的最终矩阵将是 ~
5.000^2到10.000^2。所以说到底速度也是个问题。 -
作为对版本 1 解决方案的建议,随机选择要添加/减去两个随机元素的数字是否有助于更快地打破相关性?换句话说,在您的示例中,您从每个元素中添加/减去 1 - 如果您随机选择另一个数字(但小于或等于行的总和)来添加/减去,是否需要更少的迭代来实现不相关的矩阵?
标签: algorithm performance matlab matrix