2017-12-23 11 views
3

私は `matlabですべての24ビットRGBカラー画像を生成するスクールプロジェクトのスクリプト/機能に取り組んでいます。Matlab allRGB image

私はこのような書き込みをしましたが、遅いです(とmatlabは私のようなものではありませんし、多くのクラッシュ)。クラッシュ前の最後の5日間は5日間働いていました。ここ はコードです:

a = 1; 
for r = 0:255 
    for g = 0:255 
     for b = 0:255 
      colors(a,:) = [r g b]; 
      a = a + 1; 
     end 
    end 
end 

colors = reshape(colors, [4096, 4096, 3]); 

colors = uint8(colors); 
imshow(colors); 
imwrite(colors, 'generated.png'); 

これを行うには、任意のより高速なアプローチはありますか?

答えて

2

repmat/repelemを使用して3つの列を別々に構築し、それらを連結します。

colors = [repelem((0:255).',256^2),... 
      repmat([repelem((0:255).',256) repmat((0:255).',256,1)],256,1)]; 
+0

結果は2Dです。質問で述べたように、結果は3Dでなければなりません。 – OmG

+1

@OmGこれは、OPのループのベクトル化です。 OPがやっていることの残りは同じままです。 –

+0

私は知っていますが、OPはそれをどのように知っていますか? – OmG

2

コードを高速化するために大きな行列を事前に割り当てることは、一般的には良い考えです。あなたの現在の実装では、colorsのサイズは、多くのメモリ割り当てリソースを必要とする反復ごとに1つの行を増やします。コードの冒頭に

colors = zeros(2^24, 3); 

で行列を定義してください。メモリと時間を節約するために、後で変換する代わりに、先頭からuint8と定義することもできます。

colors = zeros(2^24, 3, 'uint8');