这是我现在使用的代码,其中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
代码可以工作,但如果十进制数组的长度很大,则需要很长时间。有没有更有效的方法来做到这一点?
答案 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
这应该提供与示例代码相同的结果,但应该明显更快。