鉴于MATLAB uint32被解释为一个位串,什么是一种有效和简洁的方法来计算字符串中有多少非零位?
我有一个工作,天真的方法循环比特,但这对我的需求来说太慢了.(使用std :: bitset count()的C++实现几乎立即运行).
我找到了一个非常好的页面列出了各种位计数技术,但我希望有一种简单的MATLAB方式.
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
更新#1
刚刚实现了Brian Kernighan算法,如下所示:
w = 0;
while ( bits > 0 )
bits = bitand( bits, bits-1 );
w = w + 1;
end
Run Code Online (Sandbox Code Playgroud)
性能仍然很糟糕,超过10秒钟只计算4096 ^ 2重量计算.使用std :: bitset中的count()的我的C++代码在亚秒时间内执行此操作.
更新#2
这是我迄今为止尝试过的技术的运行时间表.我会在获得更多想法/建议时更新它.
矢量化Scheiner算法=> 2.243511秒 矢量化朴素bitget loop => 7.553345秒 Kernighan算法=> 17.154692秒 length(find(bitget(val,1:32)))=> 67.368278秒 nnz(bitget(val,1:32))=> 349.620259秒 Justin Scheiner的算法,展开循环=> 370.846031秒 Justin Scheiner的算法=> 398.786320秒 天真的比特环= = 456.016731秒 sum(dec2bin(val)=='1')=> 1069.851993秒
注释:MATLAB中的dec2bin()函数似乎执行得很差.它运行得非常慢.
注释:"Naive bitget loop"算法实现如下:
w=0;
for i=1:32
if bitget( val, i ) == 1
w = …
Run Code Online (Sandbox Code Playgroud) 我正在寻找在SSE寄存器中打包的所有四个浮点数上翻转符号的最有效方法.
我没有在英特尔架构软件开发手册中找到这样做的固有内容.以下是我已经尝试过的事情.
对于每个案例,我在代码上循环了100亿次并得到了指示时间.我试图至少匹配4秒,这需要我的非SIMD方法,这只使用一元减号运算符.
[48秒]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9秒]
union NegativeMask { int intRep; float fltRep; } negMask; negMask.intRep = 0x80000000; _mm_xor_ps( _mm_set1_ps( negMask.fltRep ), vec );
编译器是带有-O3的gcc 4.2.CPU是英特尔酷睿2双核处理器.
我需要对稀疏矩阵进行一些数学运算.我注意到使用数组可能不是最有效的利用内存的方法,特别是因为矩阵可能有200多行.我也考虑过使用链表,但我不确定它是否会更好.这种情况是否有任何合适的数据结构[方法].
无论如何,使用C++我可以获得有关计算机的基本信息吗?例如,有没有办法可以检查正在使用多少内存(整个计算机不仅仅是我的计算机),可用的总内存,虚拟内存使用情况,CPU使用率,网络统计数据等等?
我使用的是Mac OS X Snow Leopard但我更喜欢可以为所有Mac OS(即Lion)实施的解决方案
我正在使用块处理方法来处理两个大矩阵之间的计算.
使用更大的块大小时,代码显着加快.但如果我太大了,那我就会出现Out of Memory错误.目前,我手动调整代码以找到给定输入的最大工作块大小.
我的问题:如何自动找到最大块大小的过程?
我玩弄了一下try/catch块中的所有内容,并逐渐减小块大小的循环,直到成功为止.我希望有更优雅或惯用的方式.
matlab ×2
memory ×2
bitstring ×1
c ×1
c++ ×1
cpu ×1
macos ×1
matrix ×1
networking ×1
optimization ×1
performance ×1
simd ×1
sse ×1