0

我在 matlab 中运行 MCMC 模拟,需要加快循环迭代,在分析后我发现以下循环占用的时间最多:

for i=1 : n
   u=0;
   for ii=0 : t-1
      if bitget(R(i),8-ii)==1
         u=bitset(u,ii+1+2*t);
      end
      if bitget(G(i),8-ii)==1
         u=bitset(u,ii+1+t);
      end
      if bitget(B(i),8-ii)==1
         u=bitset(u,ii+1);
      end
   end

   %u = Tcb(i)*Tcr(i);   
   p(1+u) = p(1+u) + 1; %kernel(X(i)*X(i)+Y(i)*Y(i));
end

它是获取图像颜色分布的算法的一部分。以下是配置文件结果:

配置文件结果

4

4 回答 4

1

如果没有更多知识,我只能防止@Theoretical 描述的双重计算以及一些双重查找。

for i=1 : n
   u=0;
   ri = R(i);
   gi = G(i);
   ui = U(i);
   for ii=0 : t-1
      pos = 8 - ii;
      if bitget(ri,pos)
         u=bitset(u,ii+1+2*t);
      end
      if bitget(gi,pos)
         u=bitset(u,ii+1+t);
      end
      if bitget(ui,pos)
         u=bitset(u,ii+1);
      end
   end

   %u = Tcb(i)*Tcr(i);   
   p(1+u) = p(1+u) + 1; %kernel(X(i)*X(i)+Y(i)*Y(i));
end
于 2013-02-07T09:55:20.940 回答
1

假设R和是GmaricesB类型uint8。怎么样

% flip bytes function   
flip2dec = @( x ) bin2dec( char( '0' + x(8:-1:1) ) );
flip = @( x ) flip2dec( bitget( x, 1:8 ) );
% flip all at once
fR = arrayfun( flip, R );
fG = arrayfun( flip, G );
fB = arrayfun( flip, B );

u = bitshift( uint32(fR), 16 ) + bitshift( uint32(fG), 8 ) + fB;

p = accumarray( double(u(1:n)) +1, 1 ); % up to transposing of inputs
于 2013-02-07T10:17:39.097 回答
1

所以你有 8 位值,你正在反转每个红色、绿色和蓝色通道中的位,然后将它们打包成一个 24 位值。

阅读 Bit Twiddling Hacks 页面条目使用 7 次操作反转字节中的位

http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits

这些操作肯定比bitget和快bitset。MatLab 提供移位和按位与。

您可以创建一个执行反转的匿名函数,然后使用按位或移位并打包结果。

于 2013-02-06T23:43:15.770 回答
1

您可以通过在循环开始时将 8-ii 和 ii+1 定义为变量来节省一些时间,从而减少重复计算。

于 2013-02-06T22:41:22.830 回答