2010-10-17 306 views
1

这是我现在使用的代码,其中decimal1是十进制值的数组,并B是位二进制每个值数:如何在MATLAB中有效地将大十进制数组转换为二进制数组?

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 

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

回答

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的前期,使用你的代码,否则使用我的(当然,都必须修改一点点,以确定在运行时的长度,这是没有问题的,因为dec2binvec可以调用没有B参数)。

0

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 

这应该给了相同的结果作为示例代码,而应该是显著更快。

相关问题