Matlab中提取32位二进制数内嵌多个数值的最快方法是什么
位提取性能优化方案
你最初用位移位、位与的思路本身就是性能最优的方向,只要修正代码错误、调整几个细节就能大幅提升运行速度,完全不需要先尝试字符串、位遍历类的方案:
- 先修正你现有代码的两处明显问题:
Var3=bitand(Var2_temp,511)属于笔误,应该使用Var3_temp做计算- 直接写掩码常数,不要用
2^12-1这类幂运算,Matlab的幂运算每次都会实时计算,直接写4095能省掉不必要的运算开销
- 消除类型转换开销:显式将输入和掩码都转为
uint32类型,避免Matlab默认把数值当做双精度处理产生的跨类型运算开销 - 去掉不必要的临时变量,减少赋值操作的开销
优化后的代码如下:
% 确保输入为uint32类型 fourbytes = uint32(fourbytes); Var1 = bitshift(fourbytes, -30); Var2 = bitand(bitshift(fourbytes, -22), uint32(511)); Var3 = bitand(bitshift(fourbytes, -13), uint32(511)); Var4 = bitand(fourbytes, uint32(4095));
如果是批量处理大量uint32数据,直接用上述代码做向量化运算即可,不需要写循环,向量化处理的速度会比单条循环处理高几十倍。
什么时候需要用C实现?
只有当你处理超大规模数据、上述向量化Matlab代码的速度仍达不到要求时,再考虑用C写MEX函数:
- 单条/少量数据处理场景下,优化后的Matlab位运算和C语言的性能差距不到20%,完全没必要换C实现
- 千万级以上数据批量处理场景下,C写的MEX函数大概能比向量化Matlab代码快2~5倍,可以根据你的性能需求选择
你之前尝试的bitget+bin2dec/bi2de方案慢是必然的,这类都是高层封装函数,涉及字符串操作、数组遍历,开销是原生位运算的数百上千倍,不适合做高性能位提取。
内容的提问来源于stack exchange,提问作者Tom Mozdzen
相关产品推荐
相关产品推荐

