如何用零随机替换非零元素?

时间:2013-08-16 16:26:08

标签: matlab

我有一个包含10元素的矩阵,如下所示,用作网络邻接矩阵。

A =

    0     1     1     1
    1     1     0     1
    1     1     0     1
    1     1     1     0

我想模拟对网络的攻击,因此我必须使用1随机替换某些特定百分比的0元素。我怎么能在MATLAB中做到这一点?

我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的元素是矩阵的1元素之一而不是零。

3 个答案:

答案 0 :(得分:5)

如果您想以一定的概率更改每个1

p = 0.1%; % desired probability of change

A_ones = find(A); % linear index of ones in A
A_ones_change = A_ones(rand(size(A_ones))<=p); % entries to be changed
A(A_ones_change) = 0; % apply changes in those entries

如果您想随机更改1条目的固定部分:

f = 0.1; % desired fraction

A_ones = find(A);
n = round(f*length(A_ones));
A_ones_change = randsample(A_ones,n);
A(A_ones_change) = 0;

请注意,在这种情况下,得到的分数可能与预期的不同,因为需要舍入到整数个条目。

答案 1 :(得分:3)

@ horchler的观点很好。但是,如果我们保持简单,那么您可以将输入矩阵多个到掩码矩阵。

>> a1=randint(5,5,[0 1]) #before replacing 1->0

a1 =

     1     1     1     0     1
     0     1     1     1     0
     0     1     0     0     1
     0     0     1     0     1
     1     0     1     0     1

>> a2=random('unif',0,1,5,5) #Assuming frequency distribution is uniform ('unif')

a2 =

    0.7889    0.3200    0.2679    0.8392    0.6299
    0.4387    0.9601    0.4399    0.6288    0.3705
    0.4983    0.7266    0.9334    0.1338    0.5751
    0.2140    0.4120    0.6833    0.2071    0.4514
    0.6435    0.7446    0.2126    0.6072    0.0439

>> a1.*(a2>0.1) #And the replacement prob. is 0.1

ans =

     1     1     1     0     1
     0     1     1     1     0
     0     1     0     0     1
     0     0     1     0     1
     1     0     1     0     0

其他技巧可以添加到掩码矩阵(a2)中。比如不同的频率。分布或结构(例如,一旦更换细胞,相邻细胞就不太可能被替换等等。) 欢呼声。

答案 2 :(得分:0)

函数find是你的朋友:

indices = find(A);

这将返回矩阵A中1个元素的索引数组,您可以使用在此数组的子集上用零替换元素百分比的方法。然后,

A(subsetIndices) = 0;

将用零替换A的剩余索引。