Вычисление веса Hamming эффективно в matlab

Различия между расширяющейся нитью и реализуемым Runnable:

enter image description here

14
задан kay 2 June 2013 в 15:39
поделиться

4 ответа

Мне было бы интересно узнать, насколько быстро это решение:

function r = count_bits(n)

shifts = [-1, -2, -4, -8, -16];
masks = [1431655765, 858993459, 252645135, 16711935, 65535];

r = n;
for i=1:5
   r = bitand(bitshift(r, shifts(i)), masks(i)) + ...
      bitand(r, masks(i));
end

Возвращаясь назад, я вижу, что это «параллельное» решение, приведенное на странице битхаков.

9
ответ дан 1 December 2019 в 10:19
поделиться

Если это не упражнение по реализации MATLAB, вы можете просто возьмите вашу быструю реализацию на C ++ и скомпилируйте ее как функцию mex один раз для каждой целевой платформы.

5
ответ дан 1 December 2019 в 10:19
поделиться

РЕДАКТИРОВАТЬ: НОВОЕ РЕШЕНИЕ

Похоже, вы хотите повторить вычисление для каждого элемента в массиве 4096 на 4096 значений UINT32. Если это то, что вы делаете, я думаю, что самый быстрый способ сделать это в MATLAB - это использовать тот факт, что BITGET разработан для работы с матрицами значений. Код будет выглядеть так:

numArray = ...your 4096-by-4096 matrix of uint32 values...
w = zeros(4096,4096,'uint32');
for iBit = 1:32,
  w = w+bitget(numArray,iBit);
end

Если вы хотите создать векторизованные версии некоторых других алгоритмов, я считаю, что BITAND также предназначен для работы с матрицами.


Старое решение ...

Самый простой способ, который я могу придумать, - это использовать функцию DEC2BIN , которая дает вам двоичное представление (в виде строки) неотрицательного целого числа:

w = sum(dec2bin(num) == '1');  % Sums up the ones in the string

Это медленно, но легко . =)

5
ответ дан 1 December 2019 в 10:19
поделиться

Попробуйте разделить задание на более мелкие части. Я предполагаю, что если вы хотите обрабатывать все данные одновременно, Matlab пытается выполнить каждую операцию со всеми целыми числами перед выполнением последовательных шагов, и кеш процессора становится недействительным с каждым шагом.

for i=1:4096,
    «process bits(i,:)»
end
0
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: