Мне было бы интересно узнать, насколько быстро это решение:
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
Возвращаясь назад, я вижу, что это «параллельное» решение, приведенное на странице битхаков.
Если это не упражнение по реализации MATLAB, вы можете просто возьмите вашу быструю реализацию на C ++ и скомпилируйте ее как функцию mex один раз для каждой целевой платформы.
РЕДАКТИРОВАТЬ: НОВОЕ РЕШЕНИЕ
Похоже, вы хотите повторить вычисление для каждого элемента в массиве 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
Это медленно, но легко . =)
Попробуйте разделить задание на более мелкие части. Я предполагаю, что если вы хотите обрабатывать все данные одновременно, Matlab пытается выполнить каждую операцию со всеми целыми числами перед выполнением последовательных шагов, и кеш процессора становится недействительным с каждым шагом.
for i=1:4096,
«process bits(i,:)»
end