如何在MATLAB中有效地将大十进制数组转换为二进制数组?

时间:2010-10-17 15:42:58

标签: arrays matlab binary

这是我现在使用的代码,其中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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

DEC2BINVEC中的Data Acquisition Toolbox函数与内置函数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

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