我有一个包含1
和0
元素的矩阵,如下所示,用作网络邻接矩阵。
A =
0 1 1 1
1 1 0 1
1 1 0 1
1 1 1 0
我想模拟对网络的攻击,因此我必须使用1
随机替换某些特定百分比的0
元素。我怎么能在MATLAB中做到这一点?
我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的元素是矩阵的1
元素之一而不是零。
答案 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的剩余索引。