Matlab:二进制值随机变量

Matlab: binary valued random variable

问题 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.1101x = 1101x= 1 (位),输出 y 仍然不是二进制的。 机器将输入理解为十进制,因此 returns 是一个十进制基数。我如何使用此映射来建模/表示二进制值随机变量?

问题 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.

我尝试使用 .* 但我仍然不断收到此错误。我该如何解决这两个问题?

如果提供代码,应该会有帮助。

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

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

问题 2:

我不确定你想在这里做什么。该错误是由于尝试对 logical 类型的向量进行矩阵乘法造成的。矩阵乘法仅为数字类型定义。一个临时的 hack 是在相乘之前将 0.0 添加到向量中,从而将值转换为 double

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

Problem 1: I have the decimal representation of a rational.

太棒了。到目前为止一切顺利...

This is the code for generating binary number.

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

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

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

x(1) = num / den;

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

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

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

dec2bin returns 值以字符串而不是数字表示。如果我们想实现你的功能并保持使用二进制表示的路径,我们可以这样做:

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);