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

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

Функция 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

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

0 голосов
/ 17 октября 2010
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 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...