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

ループの開始時に8-iiとii+1を変数として定義することで時間を節約でき、それによって繰り返しの計算を減らすことができます。

于 2013-02-06T22:41:22.830 に答える
1

したがって、8 ビットの値があり、赤、緑、青の各チャネルのビットを逆にしてから、それらを 24 ビットの値にパックします。

Bit Twiddling Hacks ページ エントリを読む7 つの操作でバイト内のビットを反転します

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

これらの操作は、bitgetやより確実に高速ですbitset。MatLab は、シフトとビットごとの AND を提供します。

反転を行う無名関数を作成し、シフトして結果をビットごとの OR でパックできます。

于 2013-02-06T23:43:15.770 に答える
1

Without more knowledge I can only prevent double calculations as @Theoretical described as well as some double lookups.

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タイプのマリスです。どうですかGBuint8

% 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 に答える