reshape
とpermute
でこれを行うことができます。まず、どのように変形が働くかを理解する。
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)])
、あなたのコードは、高速(比較的)となります。最初のforループの前に 'res = -1 * ones(128 * 128 * 64 * 20、3)'を含めることで事前に割り当てます。ずっと速い選択肢のために、以下の答えを見てください。 –
未回答の質問リストから外れるように、左側のチェックマークをクリックして回答を受け入れてください。 –