Как я могу эффективно преобразовать большой десятичный массив в двоичный массив в 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).