【问题标题】:Matlab: binary valued random variableMatlab:二进制值随机变量
【发布时间】:2015-12-11 03:29:08
【问题描述】:

问题 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 仍然不是二进制的。 机器将输入理解为十进制,因此返回一个十进制基数。如何使用此映射来建模/表示二进制值随机变量?

问题 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) “b 不是数组”是什么意思? dec2bin 返回一个字符数组(也就是说,如果你给它一个整数,它会)。 2) 你希望两个逻辑向量相乘得到什么结果?
  • @beaker:请看我的更新,我已经解释了缺失的部分
  • 不,仍然没有看到您的问题。您在遍历字符串时遇到问题吗?为什么要介绍s?如果你想直接实现数学公式,你可以简单地使用 x 而不进行转换。
  • 请看我的回答。我仍然很不确定我是否理解你的困惑,所以如果我猜错了,请澄清。

标签: arrays matlab binary


【解决方案1】:

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

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

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

不,这是生成数字的二进制表示的代码。它与您以十进制表示的数字相同。我知道你认为我很迂腐,但据我所知,这是你困惑的根源。数字是一个数字,与表示无关。五只羊就是五只羊,无论你是用二进制、十进制、八进制还是用 Hammish 左手的手指写(他只剩下 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 返回的值是字符串而不是数字。如果我们想实现您的功能并保持使用二进制表示的这种方式,我们可以这样做:

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】:

    问题 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)';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2018-10-24
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      相关资源
      最近更新 更多