Dato che uint32 MATLAB deve essere interpretato come una stringa di bit, qual è un modo efficiente e conciso per contare quanti bit diversi da zero sono presenti nella stringa?Calcolo efficiente del peso di Hamming in MATLAB
Ho un approccio ingenuo e funzionante che scorre sui bit, ma è troppo lento per le mie esigenze. (Un'implementazione in C++ che utilizza std :: bitset count() viene eseguita quasi istantaneamente).
Ho trovato una pagina molto carina che elenca varie tecniche di conteggio dei bit, ma spero che esista un semplice modo MATLAB.
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
Update # 1
appena implementato l'algoritmo di Brian Kernighan come segue:
w = 0;
while (bits > 0)
bits = bitand(bits, bits-1);
w = w + 1;
end
performance è ancora scadente, più di 10 secondi per calcolare solo 4096^2 Peso calcoli. Il mio codice C++ che usa count() da std :: bitset lo fa in un secondo tempo.
Aggiornamento # 2
Ecco una tabella dei tempi di funzionamento per le tecniche che ho provato finora. Lo aggiornerò man mano che avrò altre idee/suggerimenti.
Vectorized Scheiner algorithm => 2.243511 sec Vectorized Naive bitget loop => 7.553345 sec Kernighan algorithm => 17.154692 sec length(find(bitget(val, 1:32))) => 67.368278 sec nnz(bitget(val, 1:32)) => 349.620259 sec Justin Scheiner's algorithm, unrolled loops => 370.846031 sec Justin Scheiner's algorithm => 398.786320 sec Naive bitget loop => 456.016731 sec sum(dec2bin(val) == '1') => 1069.851993 sec
Commento: La funzione DEC2BIN() in MATLAB sembra essere molto scarsamente applicata. Funziona estremamente lentamente.
Commento: L'algoritmo "Naive ciclo bitget" è implementato come segue:
w=0;
for i=1:32
if bitget(val, i) == 1
w = w + 1;
end
end
Commento: La versione anello srotolato dell'algoritmo di Scheiner si presenta come segue:
function w=computeWeight(val)
w = val;
w = bitand(bitshift(w, -1), uint32(1431655765)) + ...
bitand(w, uint32(1431655765));
w = bitand(bitshift(w, -2), uint32(858993459)) + ...
bitand(w, uint32(858993459));
w = bitand(bitshift(w, -4), uint32(252645135)) + ...
bitand(w, uint32(252645135));
w = bitand(bitshift(w, -8), uint32(16711935)) + ...
bitand(w, uint32(16711935));
w = bitand(bitshift(w, -16), uint32(65535)) + ...
bitand(w, uint32(65535));
È possibile effettuare una sorta di pulizia su questa domanda? Piccola domanda e sposta le altre cose ad una risposta sommaria per esempio? Domanda correlata [qui] (http://stackoverflow.com/questions/19835495/matlab-fast-way-to-sum-ones-in-binary-umbers), molto più facile da capire come piccola. – hhh
-1 domanda troppo poco chiara e nessun miglioramento fatto nonostante l'avviso. – hhh
@kay Potete per favore fornire il codice per la versione Vectorized del "loop di bit di Naive"? – SebMa