Matlab 如何用零随机替换非零元素?
我有一个矩阵,包括Matlab 如何用零随机替换非零元素?,matlab,Matlab,我有一个矩阵,包括1和0元素,如下所示,用作网络邻接矩阵 A = 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 我想模拟对网络的攻击,因此我必须用0随机替换1元素的特定百分比。如何在MATLAB中实现这一点 我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的元素是矩阵的1元素之一,而不是零。函数find是您的朋友: indices =
1
和0
元素,如下所示,用作网络邻接矩阵
A =
0 1 1 1
1 1 0 1
1 1 0 1
1 1 1 0
我想模拟对网络的攻击,因此我必须用0
随机替换1
元素的特定百分比。如何在MATLAB中实现这一点
我知道如何用零随机替换一定百分比的元素,但我必须确保随机替换的元素是矩阵的
1
元素之一,而不是零。函数find是您的朋友:
indices = find(A);
这将返回矩阵A中1个元素的索引数组,您可以使用此数组子集上的元素百分比替换为零的方法。那么
A(subsetIndices) = 0;
将A的剩余索引替换为零。如果要以一定的概率更改每个
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
请注意,在这种情况下,结果分数可能与预期分数不同,因为需要将条目四舍五入为整数。@horchler's point是一个很好的分数。但是,如果我们保持简单,那么您可以将输入矩阵乘以掩码矩阵
>> 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)。例如不同的频率分布或结构(例如,一旦更换一个单元,相邻单元更换的可能性就会降低,等等)
干杯。您是否希望1个元素被替换的概率为
百分比
/100,而与另一个元素是否被替换无关。或者你想随机替换百分比1个元素?@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