matlab有效计算,在matlab中有效地计算汉明重量

鉴于MATLAB uint32被解释为一个位串,什么是一种有效和简洁的方法来计算字符串中有多少非零位?

我有一个工作,天真的方法循环比特,但这对我的需求来说太慢了.(使用std :: bitset count()的C++实现几乎立即运行).

我找到了一个非常好的页面列出了各种位计数技术,但我希望有一种简单的MATLAB方式.

更新#1

刚刚实现了Brian Kernighan算法,如下所示:

w = 0;

while ( bits > 0 )

bits = bitand( bits, bits-1 );

w = w + 1;

end

性能仍然很糟糕,超过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 = w + 1;

end

end

注释:Scheiner算法的循环展开版本如下所示:

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));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值