2011-01-22 11 views
1

3次元行列(行:240、列:320、深さ:3)に並べ替える整数(長さ:230,400、int8)を含む大きなベクトルがあります。これが完了すると、新しいマトリックスにはintの代わりにdoubleが含まれます(Matlab Workspaceによる)。Matlabで倍数ではなく整数を含む行列

全体の操作には0.3秒かかりますが、これは長時間です。

Matlabは、行列のintを行列に入れる前にdouble型に変換していますか? これを回避するとスピードアップできますか?

いくつかのコード:

tic; 
    A=zeros(240,320,3); 
    %A is matrix, B is vector. 

    for i=1:240 
     for j=1:320 
      A(i,j,:)=B(1+(j-1)*3+(i-1)*320*3:3+(j-1)*3+(i-1)*320*3); 
     end 
    end 

    toc; 

ありがとう!

答えて

2

A=zeros(240, 320, 3, 'int8') 
+0

のクラスを保持しますB.に再構築を使用します。しかし、時間はわずか0.03秒で短縮されました.... –

7

であなたの行列を初期化してみただ、これは高速であると感謝B.

A = reshape(B,[3,320,240]); %# makes a 3-by-320-by-240 array and distributes elements of B 
A = permute(A,[3 2 1]);  %# turns A into a 240-by-320-by-3 array 
+0

はい、素晴らしい! =) –

+5

ブルートフォースを二重に入れ子にしたループではなく、このような問題に対して変形、置換、転置を学ぶ。これはベクトル化の芸術であり、明示的なループのない配列を操作する方法を学びます。 –

+0

私は@ woodchipsに同意します。しかし、JITがこれらの最適化を実行することがあることを忘れないでください。とにかく、簡単なコードを書いたり、単体テストを作成したり、リファクタリングしたりするのは良い習慣です –