代码之家  ›  专栏  ›  技术社区  ›  SKM

Matlab:二进制值随机变量

  •  0
  • SKM  · 技术社区  · 9 年前

    问题1:我有有理数的十进制表示。这是生成二进制数的代码。

     x(1) = rand();
       [num, den] = rat(x);
                 
    
              q = 2^32;
              x1 = num / den * q;
              b = dec2bin(x1, bits);
              s = str2num(b')';
    

    更新: 有关的信息 Dyadic map 代码表示为

    y = mod(x*2, 1)
    

    表示如果输入, x 是二进制迭代 s ,则输出应为二进制,位向左移动一个位置。但是,如果我输入 x = 0.1101 x = 1101 x= 1 (位)仍然输出 y 不是二进制的。 机器将输入理解为十进制,因此返回十进制基数。如何使用此映射来建模/表示二进制值随机变量?

    问题2:(根据答案解决)

    其次,我需要做另一项涉及指挥部的操作

    (X(:,i)>=threshold)*(X(:,i)>=threshold)';
    

    哪里 X 是实值数和变量的矩阵

    threshold = 0.5
    

    i 是元素的索引。我总是犯这个错误

    Error using  * 
    Both logical inputs must be scalar.
    To compute elementwise TIMES, use TIMES (.*) instead.
    

    我尝试使用 .* 但我还是不断地犯这个错误。如何解决这两个问题?

    如果提供了代码,这将很有帮助。

    2 回复  |  直到 4 年前
        1
  •  0
  •   beaker    9 年前

    问题1:我有有理数的十进制表示。

    太棒了到现在为止,一直都还不错。。。

    这是生成二进制数的代码。

    不,这是生成二进制文件的代码 代表 一个数字。这是你用十进制表示的同一个数字。我知道你认为我很迂腐,但据我所知,这是你困惑的根源。数字是一个数字,与表示形式无关。五只羊就是五只羊,无论你用二进制、十进制、八进制还是用哈米什左手上的手指写(他只剩下4只)。

    让我们稍微更改一下代码。

    bits = 32;
    r = rand();
    [num, den] = rat(r);
    q = 2^bits;
    
    x(1) = num / den;
    

    存储在中的值 x(1) 是一个有理数。如果我们键入 disp(x(1)) 在Matlab中,它将以十进制形式显示该数字的值 代表 。我们可以使用 dec2bin 命令:

    b(1,:) = dec2bin(round(x(1)*q), bits);
    

    但仍然是相同的数字。(实际上,它不是同一个数字,因为我们现在将精度限制为 bits 位而不是Matlab生成的原生53位。稍后将详细介绍。)

    但是 12月2日 返回以字符串而不是数字表示的值。如果我们想实现你的函数并保持使用二进制表示的路径,我们可以这样做:

    b(1,:) = dec2bin(round(x(1)*q), bits);
    for d = 2:bits
       b(d,:) = [b(d-1,2:end) '0'];
    end
    

    二进制表示的每次左移都会将值乘以2 mod 活动因为我们没有额外的有效数字可以加到值的最低有效位,所以我只加一个零。

    这将奏效;您可以获得正确的值,并可以对其执行任何操作。你可以将它们表示为二进制或十进制,也可以将它们转换为分数,无论是什么。

    但您可以在不转换为二进制表示的情况下实现相同的功能。

    x(1) = num / den;
    for d = 2:bits
       x(d) = mod(x(d-1)*2, 1);
    end
    

    (注意,我将值保留在 x(1) 作为分数。) 这对完全相同的数字执行完全相同的操作。唯一的区别是我一开始没有降低数字的精度,所以它使用了完整的 double 精确现在,如果我想获取这些值并将其表示为二进制,我仍然可以这样做(不过,请记住首先将值强制为整数范围)。

    c = dec2bin(round(x*q), bits);
    

    以下是两个版本的测试运行结果:

    b =
    
    11110000011101110111110010010001
    11100000111011101111100100100010
    11000001110111011111001001000100
    10000011101110111110010010001000
    00000111011101111100100100010000
    00001110111011111001001000100000
    00011101110111110010010001000000
    00111011101111100100100010000000
    01110111011111001001000100000000
    11101110111110010010001000000000
    11011101111100100100010000000000
    10111011111001001000100000000000
    01110111110010010001000000000000
    11101111100100100010000000000000
    11011111001001000100000000000000
    10111110010010001000000000000000
    01111100100100010000000000000000
    11111001001000100000000000000000
    11110010010001000000000000000000
    11100100100010000000000000000000
    11001001000100000000000000000000
    10010010001000000000000000000000
    00100100010000000000000000000000
    01001000100000000000000000000000
    10010001000000000000000000000000
    00100010000000000000000000000000
    01000100000000000000000000000000
    10001000000000000000000000000000
    00010000000000000000000000000000
    00100000000000000000000000000000
    01000000000000000000000000000000
    10000000000000000000000000000000
    
    
    c =
    
    11110000011101110111110010010001
    11100000111011101111100100100001
    11000001110111011111001001000010
    10000011101110111110010010000101
    00000111011101111100100100001001
    00001110111011111001001000010011
    00011101110111110010010000100101
    00111011101111100100100001001010
    01110111011111001001000010010100
    11101110111110010010000100101000
    11011101111100100100001001010001
    10111011111001001000010010100001
    01110111110010010000100101000011
    11101111100100100001001010000101
    11011111001001000010010100001010
    10111110010010000100101000010101
    01111100100100001001010000101010
    11111001001000010010100001010100
    11110010010000100101000010100111
    11100100100001001010000101001111
    11001001000010010100001010011101
    10010010000100101000010100111010
    00100100001001010000101001110100
    01001000010010100001010011101000
    10010000100101000010100111010000
    00100001001010000101001110100000
    01000010010100001010011101000000
    10000100101000010100111010000000
    00001001010000101001110100000000
    00010010100001010011101000000000
    00100101000010100111010000000000
    01001010000101001110100000000000
    

    两者完全相同,只是事实上 b 32位后超出精度 c 具有53位精度。你可以通过运行上面的代码来确认这一点 x(1) single :

    x(1) = single(num / den);
    
        2
  •  0
  •   crowdedComputeeer    9 年前

    问题1:(已更新) 这反映了您的更新,即您的目标是二元映射。

    将Matlab视为 摘要 二进制数的概念。它没有内置的支持二进制数字的数字运算。事实上,它没有位的数字表示。它只有用于位的字符串。您可以通过自定义函数输入十进制数,使其看起来是二进制的,但对Matlab来说,它仍然是一个浮点数。如果你把 x = 0.1101 通过 y= mod(2*x,1) 它会治疗 x 作为浮点

    问题2:

    我不知道你想在这里做什么。该错误是由于试图将类型为 logical 。矩阵乘法仅为数字类型定义。临时黑客将添加 0.0 在相乘之前将值转换为 double

    ((X(:,i)>=threshold)+0.0)*((X(:,i)>=threshold)+0.0)';