【问题标题】:How can I efficiently convert a large decimal array into a binary array in MATLAB?如何在 MATLAB 中有效地将大型十进制数组转换为二进制数组?
【发布时间】:2011-04-26 14:51:21
【问题描述】:

这是我现在使用的代码,其中decimal1 是十进制值数组,B 是每个值的二进制位数:

for (i = 0:1:length(decimal1)-1)
    out = dec2binvec(decimal1(i+1),B);
    for (j = 0:B-1)
        bit_stream(B*i+j+1) = out(B-j);
    end
end

代码有效,但是如果十进制数组的长度很大,则需要很长时间。有没有更有效的方法来做到这一点?

【问题讨论】:

    标签: arrays matlab binary


    【解决方案1】:
    bitstream = zeros(nelem * B,1);
    
    for i = 1:nelem
        bitstream((i-1)*B+1:i*B) = fliplr(dec2binvec(decimal1(i),B));
    end
    

    我认为这应该是正确的,而且速度要快得多(希望如此:))。

    编辑:

    我认为您的主要问题是您可能没有预先分配 bit_stream 矩阵。

    我测试了两个代码的速度,如果我们都预先分配比特流,我发现你的比我的快(虽然不是很多),即使我(有点)对我的代码进行了矢量化。

    如果我们不预先分配比特流,我的代码会快很多。发生这种情况是因为您的代码比我的代码更频繁地重新分配矩阵。

    所以,如果您预先知道 B,请使用您的代码,否则使用我的代码(当然两者都必须稍作修改以确定运行时的长度,这没问题,因为可以在没有 B 参数的情况下调用 dec2binvec )。

    【讨论】:

      【解决方案2】:

      来自Data Acquisition Toolbox 的函数DEC2BINVEC 与内置函数DEC2BIN 非常相似,因此this question 中讨论的一些替代方法可能对您有用。这是一个尝试的选项,使用函数BITGET

      decimal1 = ...;  %# Your array of decimal values
      B = ...;         %# The number of bits to get for each value
      nValues = numel(decimal1);        %# Number of values in decimal1
      bit_stream = zeros(1,nValues*B);  %# Initialize bit stream
      for iBit = 1:B                    %# Loop over the bits
        bit_stream(iBit:B:end) = bitget(decimal1,B-iBit+1);  %# Get the bit values
      end
      

      这应该提供与您的示例代码相同的结果,但应该更快。

      【讨论】:

        猜你喜欢
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        • 2012-09-14
        • 1970-01-01
        • 2020-09-10
        • 2020-09-08
        • 2016-12-25
        相关资源
        最近更新 更多