Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在1';s和0';s_Matlab_Matrix - Fatal编程技术网

Matlab 在1';s和0';s

Matlab 在1';s和0';s,matlab,matrix,Matlab,Matrix,对于下面的字母,我希望通过将5%的1改为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 ...

对于下面的字母,我希望通过将5%的1改为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)
试试这个:

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

letterA(letterA==1&rand(size(letterA))基本方法是找到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

这将使5%的1变为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);
背景噪声强度=0.05;
字母\噪声\强度=0.05;
对于i=1:numel(字母A)
如果字母a(i)==0
如果rand<背景噪音强度
字母a(i)=1;
结束
其他字母a(i)=1
如果rand<字母\u噪声\u强度
字母a(i)=0;
结束
结束
结束
嘈杂的字母=字母A;
重塑的字母=重塑(噪音字母,37,19)';
imshow(重塑字母);

我不懂那种语言,所以我不能提供代码示例。但是你可以有一个整数类型的变量,在每次迭代时给它加上+1。只要它能除以20,就翻转位。或者更好,使事情随机(否则我不会认为它是噪音)-在每次迭代中,生成一个介于1和20之间的随机数。如果你得到一个20,则翻转位。另外,我得到了某种程度的sinestesia…在我看来,a是一个大的、粉红色的3D字母,从显示器中出现。谢谢你的艺术:)如果你想平均翻转5%的非零位,你可以使用Andreas或Ran的解决方案。如果你想翻转5%的非零位,请使用Eitan的解决方案。在任何情况下:在大多数情况下,真实噪声不仅破坏信号,还产生信号,这意味着,其中一些零也应该变成1。还有,你的方式它现在的定义意味着
letterA
属于
double
类型,它浪费的空间是所需空间的64倍:)逻辑(letterA)
有什么问题?使用
letterA(letterA)
这样索引非零位更容易…@EitanT不知道你为什么这么想;以5%的均匀概率翻转x值意味着任何子集y中的元素也有5%的几率翻转…0.05*N==(0.05*N/m)*m@RodyOldenhuis是的,我有一个思维障碍。这仍然可能在个别试验中产生不可接受的结果,例如3%和7%。这就是OP想要的吗?@EitanT看起来是这样的,正如他所说的“大约5%”:)但这完全取决于OP认为术语“大约”的意思:P这不能保证在5%的“1”上运行(只有当“1”与小于0.05的随机矩阵的值重叠时才起作用…@EitanT:你错了。检查以下内容:字母A=(兰特(1e5,1)<0.2);N1=nnz(字母A);letterA(letterA==1&rand(尺寸(letterA))<0.05)=0;(N1-nnz(letterA))/N1这正好去除了5%的1。因此,我的解决方案正是OP想要的。我认为你们的是错误的。假设
rand
生成一个随机矩阵,其中所有>0.05的值都和0重叠。这意味着没有人会被炒鱿鱼。如果
字母a
稀疏,几乎总是会发生这种情况。只有在极少数情况下,您的随机矩阵生成的图案翻转约为1的5%。此外,您计算的是非零元素的总数,而不是1总数中翻转了多少个1,因此您的测试代码无效。N1-nnz(letterA)是翻转的元素的数量,(N1-nnz(letterA))/N1是翻转的元素的百分比,应该在5%左右。如果我错了,请纠正我。但我同意,我的代码以5%的概率将1翻转为0,这并不意味着只有5%的1被翻转(只有在有大量1的情况下)。你知道吗,我承认我没有正确地考虑它。但是,尽管它平均翻转了5%,但这种偏差很可能是不可接受的。所以一次试验可能给你3%,一次可能给你7%,平均产生5%。。。这就是OP想要的吗?+1,然而,OP确实说了“大约”5%,而你正好做了5%。这使得Andreas的解决方案更具吸引力……嗯,这对我来说不起作用:letterA=(rand(1e5,1)<0.1);N1=nnz(字母A);你的密码;(N1-nnz(letterA))/N1给了我0.5%而不是5%。看起来没问题,我不能在这里提供任何基本建议。如果你想让它更有效率,你可以写letterA_orig=letterA;letterA(letterA==1&rand(尺寸(letterA))<字母噪音强度)=0;letterA(letterA_orig==0&rand(尺寸(letterA))<背景噪声强度)=1;请注意,这适用于任意维度的letterA。因此,如果letterA已经是37x19矩阵,则整形也可以在之前进行,或者不需要进行整形。@ShankarKumar您真的在寻找这种类型的噪声吗?为什么不简单地随机翻转位呢?e、 g:
idx=rand(尺寸(字母a))。您可以使用阈值
tol
控制噪声强度。
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
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);