Как я могу эффективно преобразовать большой десятичный массив в двоичный массив в MATLAB?

Вот код, который я использую сейчас, где 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 ответа

Функция DEC2BINVEC из панели инструментов сбора данных очень похожа на встроенную функцию DEC2BIN, поэтому некоторые из альтернатив, обсуждаемых в этом вопросе, могут быть вам полезны. Вот один из вариантов, чтобы попробовать, используя функцию 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

Это должно дать те же результаты, что и ваш пример кода, но должно быть значительно быстрее.

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

Другие вопросы по тегам