【问题标题】:Generate matrix of bits生成位矩阵
【发布时间】:2013-05-05 10:06:55
【问题描述】:

我想取一个整数 n 定义我的通信代码中的位数和一个向量定义我分配给位 0:n-1 的字母表,并输出一个矩阵/单元数组,其中包含每个字符的字母符号状态,即:

function M = mycommarray(3,[-1,1])

生产

M = [{-1,-1,-1}, {-1,-1,1}...]

我尝试使用dec2bin(0:7,3) 以更简单的方式执行此操作,但似乎没有一种快速的方法可以将零变为-1s。

有没有任何接近预包装的东西可以做到这一点?在这种情况下,我不希望任何人为我做(与家庭作业有关)。

【问题讨论】:

    标签: matlab bit-manipulation octave


    【解决方案1】:

    dec2bin 实际上不是解决问题的最佳方法,因为它的结果是一个字符串数组(字符矩阵),其中每个数字都是一个字符。如果你想让'-1' 代表一个逻辑“0”,那就是两个字符,这会带来问题。

    考虑使用bitget 的替代方法。利用 Shai 的建议,执行以下操作:

    [bits, values] = meshgrid(1:3, 0:7);
    M = 2 * bitget(values, bits) - 1;
    

    会产生你想要的:

    M =
        -1    -1    -1
         1    -1    -1
        -1     1    -1
         1     1    -1
        -1    -1     1
         1    -1     1
        -1     1     1
         1     1     1
    

    【讨论】:

    • 看起来不错。它几乎使用 `2*bitget(101,1:3)-1` 在整个输入中广播,但除非您按照解释的方式进行操作,否则会引发输入大小错误。
    • 谢谢 :) 第一个解决方案只是让它工作起来“又快又脏”,而我用meshgrid 美化了它。
    • 要将最重要的位放在左边,就像OP在问题中提出的那样,您可以改用meshgrid(3:-1:1, 0:7)
    【解决方案2】:

    要轻松地将零转换为 -1(并保持原样),您只需这样做

    minusOnes = 2 * zeroOnes - 1;
    

    【讨论】:

    • 其实我试过了,但是dec2bin的输出是3位十进制数,所以101*2-1变成了201。
    【解决方案3】:

    你也可以这样做:

    M = 2 * (dec2bin(0:7, 3)=='1')-1;
    

    返回:

    M =
        -1    -1    -1
        -1    -1     1
        -1     1    -1
        -1     1     1
         1    -1    -1
         1    -1     1
         1     1    -1
         1     1     1
    

    但是,它比较慢。对于 1024 个值和 10 位,我得到 0.0012s (dec2bin) 和 0.0002s (meshgrid+bitget)。

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 2016-10-19
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多