2

我有一个矩阵,包括下面10元素,用作网络邻接矩阵。

A =

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

我想模拟对网络的攻击,所以我必须1随机替换某些特定百分比的元素0。如何在 MATLAB 中做到这一点?

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

4

3 回答 3

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;

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

于 2013-08-16T16:43:58.590 回答
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)中。比如不同的频率。分布,或结构(例如,一旦一个单元格被替换,相邻的单元格就不太可能被替换等等。)欢呼。

于 2013-08-16T17:39:19.597 回答
0

函数 find 是你的朋友:

indices = find(A);

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

A(subsetIndices) = 0;

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

于 2013-08-16T16:38:11.390 回答