翻转1和0的5%左右

时间:2013-07-15 17:12:07

标签: matlab matrix

对于以下信件,我希望通过将1的5%更改为0来增加噪声。到目前为止,我有以下代码将它们全部变为0。有人可以指点我正确的方向吗?谢谢!

letterA = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...
           0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ...
           0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ...
           0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ...
           0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ...
           0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ...
           0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ...
           0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; 

for i=1:numel(letterA)
    if letterA(i)==1
        letterA(i)=0;
    end
end

disp(letterA)

3 个答案:

答案 0 :(得分:3)

试试这个:

letterA( letterA == 1 & rand(size(letterA)) <= 0.05 ) = 0;

事实上你也可以做

letterA( rand(size(letterA)) <= 0.05 ) = 0;

将每个元素的概率设置为5%为零。已经零的元素不受影响。我认为导致混淆的原因是你必须认识到每个元素是相互独立处理的。如果您执行第一个或第二个版本,则没有任何区别。

您可以查看:

 letterA = (rand(1e5,1) < 0.2); N1 = nnz(letterA);
 letterA( rand(size(letterA)) <= 0.05 ) = 0;
 (N1 - nnz(letterA))/N1

给出约0.05的值,即5%。 EitanT所说的并不是真的,它将以最高5%的速度翻转。它可以超过5%或更少,但平均为5%。

EitanTs版本恰好翻了5%,因此选择哪个版本取决于应用程序。对于EitanT版本,噪声与信号相关(因为它是精确的),这可能是您想要的也可能不是。

答案 1 :(得分:2)

基本方法是找到1的索引并计算它们,从中随机选择所需数量的索引,然后对它们进行操作:

one_flip_ratio = 0.05;
idx_ones = find(letterA == 1);                          %// Indices of 1's
flips = round(one_flip_ratio * numel(idx_ones));        %// Number of flips
idx_flips = idx_ones(randperm(numel(idx_ones), flips)); %// Indices of elements
letterA(idx_flips) = 0;                                 %// Flip elements

这会将1的5%翻转为0。

答案 2 :(得分:0)

感谢您抛弃所有这些想法,但最终我想出了这个。它可以让我轻松控制字母和背景噪音,这是我打算做的。我只是一个新手,所以这可能不是最有效的代码,但它完成了工作! (我不是在寻找5%,肉眼显示值是我更担心的。)请告诉我如何改进它!谢谢。

background_noise_intensity=0.05;
letter_noise_intensity=0.05;

for i=1:numel(letterA)
    if letterA(i)==0
        if rand < background_noise_intensity
            letterA(i)=1;
        end
    elseif letterA(i)==1
        if rand < letter_noise_intensity
            letterA(i)=0;
        end
    end
end

noisy_letters=letterA;

reshaped_noisy_letters=reshape(noisy_letters,37,19)';
imshow(reshaped_noisy_letters);