में कुशलतापूर्वक हथौड़ा वजन की गणना करना एक MATLAB uint32 को थोड़ा स्ट्रिंग के रूप में व्याख्या करने के लिए दिया गया है, यह समझने का एक कुशल और संक्षिप्त तरीका क्या है कि स्ट्रिंग में कितने nonzero बिट्स हैं?matlab
मेरे पास एक कामकाजी, निष्पक्ष दृष्टिकोण है जो बिट्स पर लूप करता है, लेकिन यह मेरी आवश्यकताओं के लिए बहुत धीमा है। (Std :: बिटसेट गिनती() का उपयोग कर एक सी ++ कार्यान्वयन लगभग तुरंत चलता है)।
मुझे विभिन्न बिट गिनती तकनीकों को सूचीबद्ध करने वाला एक बहुत अच्छा पृष्ठ मिला है, लेकिन मुझे आशा है कि एक आसान MATLAB-esque तरीका है।
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
अद्यतन # 1
बस ब्रायन Kernighan एल्गोरिथ्म कार्यान्वित इस प्रकार है:
w = 0;
while (bits > 0)
bits = bitand(bits, bits-1);
w = w + 1;
end
प्रदर्शन गणना करने के लिए सिर्फ 4096^2 वजन, अभी भी भद्दा है 10 सेकंड से अधिक गणना। Std :: bitset से गिनती() का उपयोग कर मेरा सी ++ कोड उपसेकंद समय में करता है।
# 2
यहाँ अद्यतन तकनीक मैं अब तक की कोशिश की है के लिए रन समय की एक टेबल है। मैं इसे अपडेट कर दूंगा क्योंकि मुझे अतिरिक्त विचार/सुझाव मिलते हैं।
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
टिप्पणी: MATLAB में dec2bin() फ़ंक्शन बहुत खराब लागू किया जा रहा है। यह बहुत धीमी गति से चलता है।
टिप्पणी: "अनुभवहीन bitget लूप" एल्गोरिथ्म के रूप में कार्यान्वित किया जाता है इस प्रकार है:
w=0;
for i=1:32
if bitget(val, i) == 1
w = w + 1;
end
end
टिप्पणी: इस प्रकार Scheiner एल्गोरिथ्म के पाश unrolled संस्करण लगता है जैसे:
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));
क्या इस प्रश्न पर कुछ प्रकार की सफाई करना संभव है? छोटे प्रश्न और उदाहरण के लिए अन्य चीजों को संक्षिप्त उत्तर में ले जाएं? संबंधित प्रश्न [यहां] (http://stackoverflow.com/questions/19835495/matlab-fast-way-to-sum-ones-in-binary-numbers), एक छोटे से समझने के लिए कहीं अधिक आसान है। – hhh
-1 बहुत अस्पष्ट प्रश्न और नोटिस के बावजूद कोई सुधार नहीं हुआ। – hhh
@ क्या आप कृपया "बेवकूफ बिगेट लूप" के वेक्टरिज्ड संस्करण के लिए कोड दे सकते हैं? – SebMa