matlab代码优化之:bitand()和bitshift()的使用

函数介绍

bitand()函数

C=bitand(A,B);返回A和B的按位与

bitshift()函数

	bitshift(a,b);

其中a是被移位数,b是移的位数,a只能是正数,b为正数时表示向左移位,b是负数时表示向右移位

matlab代码优化

需要优化的代码:

	  a=zeros(250,400);
	  a=uint8(a);
	    for i=1:1:250
	        for j=1:1:50            
	            binstring = dec2bin(d(i,j),8);
	            m=str2num(binstring(:))';
	            a(i,1+(j-1)*8)=m(8);
	            a(i,2+(j-1)*8)=m(7);
	            a(i,3+(j-1)*8)=m(6);
	            a(i,4+(j-1)*8)=m(5);
	            a(i,5+(j-1)*8)=m(4);
	            a(i,6+(j-1)*8)=m(3);
	            a(i,7+(j-1)*8)=m(2);
	            a(i,8+(j-1)*8)=m(1);
	        end
    end
其中dec2bin的作用是把d(i,j)由uint8类型转换为8个位宽的char类型
str2num的作用是将上述字符串转化为double类型存储在m中用于后续对a矩阵的填充

上述代码中有2个for循环,matlab对for循环的运行速度非常慢

将其写入for1.m中,在代码中可以直接调用:for1

改进:

将dec2bin()和str2num()替换掉:

	
	    for i=1:1:250
	        for j=1:1:50            
	            %binstring = dec2bin(d(i,j),8);
	           % m=str2num(binstring(:))';
	            a(i,1+(j-1)*8)=bitand(bitshift(d(I,j),-0),1);
	            a(i,2+(j-1)*8)=bitand(bitshift(d(I,j),-1),1);
	            a(i,3+(j-1)*8)=bitand(bitshift(d(I,j),-2),1);
	            a(i,4+(j-1)*8)=bitand(bitshift(d(I,j),-3),1);
	            a(i,5+(j-1)*8)=bitand(bitshift(d(I,j),-4),1);
	            a(i,6+(j-1)*8)=bitand(bitshift(d(I,j),-5),1);
	            a(i,7+(j-1)*8)=bitand(bitshift(d(I,j),-6),1);
	            a(i,8+(j-1)*8)=bitand(bitshift(d(I,j),-7),1);
	        end
    end   

替代for循环,将i和j替换掉

%     for i=1:1:250
%         for j=1:1:50            
%             binstring = dec2bin(d(i,j),8);
%             m=str2num(binstring(:))';
            a(1:1:250,1+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-0),1);
            a(1:1:250,2+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-1),1);
            a(1:1:250,3+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-2),1);
            a(1:1:250,4+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-3),1);
            a(1:1:250,5+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-4),1);
            a(1:1:250,6+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-5),1);
            a(1:1:250,7+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-6),1);
            a(1:1:250,8+((1:1:50)-1)*8)=bitand(bitshift(d(1:1:250,(1:1:50)),-7),1);
%             aa(i,(1:8)+(j-1)*8)=m(9-(1:8));
%         end
%     end

注:因为上述代码嵌套在另一个for循环中,所以优化之后代码运行由原来的1个多小时,变为几秒钟,其运行结果一致

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值