我有一个矩阵,包括下面1
的0
元素,用作网络邻接矩阵。
A =
0 1 1 1
1 1 0 1
1 1 0 1
1 1 1 0
我想模拟对网络的攻击,所以我必须1
随机替换某些特定百分比的元素0
。如何在 MATLAB 中做到这一点?
我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的1
元素是矩阵的元素之一,而不是零。
我有一个矩阵,包括下面1
的0
元素,用作网络邻接矩阵。
A =
0 1 1 1
1 1 0 1
1 1 0 1
1 1 1 0
我想模拟对网络的攻击,所以我必须1
随机替换某些特定百分比的元素0
。如何在 MATLAB 中做到这一点?
我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的1
元素是矩阵的元素之一,而不是零。
如果你想以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;
请注意,在这种情况下,结果分数可能与预期的不同,因为需要四舍五入到整数个条目。
@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)中。比如不同的频率。分布,或结构(例如,一旦一个单元格被替换,相邻的单元格就不太可能被替换等等。)欢呼。
函数 find 是你的朋友:
indices = find(A);
这将返回矩阵 A 中 1 个元素的索引数组,您可以使用您的方法在该数组的子集上用零替换元素的百分比。然后,
A(subsetIndices) = 0;
将用零替换 A 的剩余索引。