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个多小时,变为几秒钟,其运行结果一致

你可能感兴趣的:(Matlab,matlab,数据结构,开发语言)