2017-02-03 14 views
1

私は5Dの配列Aを持ち、すべてのx、y、zに対してブロック A(x、y、z、:、:)を縦に積み重ねたいと思います。nD配列のブロックを垂直に積み上げる方法は?

A = rand(128, 128, 64, 20, 3); 
    a = 1; 
    for z = 1:Z 
     for y = 1:Y 
      for x = 1:X 
       res(a:a+T-1,:) = squeeze(A(x,y,z,:,:)); 
       a = a + T; 
      end 
     end 
    end 

は正しいが、この計算は私の目的のために非常に遅いことが表示されます:私は、次のように行われています。 誰も同じ目標をより効率的に達成する方法を見つけ出すことはできますか?

+0

、あなたのコードは、高速(比較的)となります。最初のforループの前に 'res = -1 * ones(128 * 128 * 64 * 20、3)'を含めることで事前に割り当てます。ずっと速い選択肢のために、以下の答えを見てください。 –

+0

未回答の質問リストから外れるように、左側のチェックマークをクリックして回答を受け入れてください。 –

答えて

0

reshapepermuteでこれを行うことができます。まず、どのように変形が働くかを理解する。

c = randi(9,[2 2 3]) 

c(:,:,1) = 

    5  8 
    2  6 


c(:,:,2) = 

    4  4 
    5  1 


c(:,:,3) = 

    3  2 
    2  3 

2 x 6マトリックスにcを作り直しましょう。今

ans = 

    5  8  4  4  3  2 
    2  6  5  1  2  3 

6 x 2行列。

ans = 

    5  4 
    2  1 
    8  3 
    6  2 
    4  2 
    5  3 

は、再構成マトリクスを作成しながら、MATLABはcの最初の次元を横断開始し、再構成マトリクスに(即ち、第1列目の行に沿って)第一の次元に沿ってそれを置くことを見ます。具体的には、再構成行列の最初の列を形成

c(1,1,1) = 5 
c(2,1,1) = 2 
c(1,2,1) = 8 
c(2,2,1) = 6 
c(1,1,2) = 4 
c(2,1,2) = 5 % stop since you would have filled 6 rows 

あなた20x3部分行列、すなわち四次元の行に沿ってなり

、あなたの例に戻って再構成行列の最初の列に来ます。最初の行は、20x3サブマトリックスの列に沿って、つまり5番目の次元に沿って表示されます。あなたが再形成されたマトリックスに(1,1)から(1,2)に横断したときにしかし、あなたはあなたの最初の3次元からすべての要素収容する必要があります(つまり128, 128, 64を、なぜ?あなたは最初の次元z最後に、その後yそして、あなたのx次元を横断しているため) 。だからあなたの答えは、次元:4,1,2,3,5の順に移動したいということです。

回答:あなたはちょうど `res`を事前に割り当てる場合はところで

sz_A = size(A); 
p = sz_A(4)*prod(sz_A(1:3)) 
reshaped_A = reshape(permute(A,[4, 1, 2, 3, 5]), [p size(A,5)]) 
+0

これはとても素晴らしいです!あなたの時間をありがとう。 の説明に続いて、A_back = permute(reshape(reshapeed_A、sz_A(4)、sz_A(1)、sz_A(2)、sz_A(3)、 sz_A(5))を使用して、reshaped_AフォームをA に戻すこともできました。 ))、[2 3 4 1 5]); – Nead

関連する問題