2016-10-20 9 views
0

私は巨大な4D行列を持っており、2D行列にスライスする必要があります。これは、手動で一つずつこれを実行するのは簡単です:4D行列を2DスライスにスライスするMatLab

slice1 = 4dmatrix(:,:,1,1) 
slice2 = 4dmatrix(:,:,1,2) 

など が、私は、この使用してループを行う方法を動作することはできません。これまで見たことのあるものは、元のマトリックスを再構成しています(これは私が望むものではありません)。

+0

だから正確に何をしたいですか?各スライスがこの4Dマトリックスの2Dスライスである3Dマトリックスを作成しますか?希望の出力は何ですか? – rayryeng

+3

'ii'と' jj'をループする 'D4matrix(:、:、ii、jj)'ループでこのようにインデックスを作成します。すべての2Dスライスを個別に作成しないでください。これは[動的変数命名法](http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170)と呼ばれています。プログラミングの習慣が悪いまた、変数名は数字で始めることができないので、実際にあなたの行列 '4dmatrix'に名前をつけることはできません。 – Adriaan

答えて

1

あなたは単純に2つのアクセス変数はあなたがたい右のスライスにアクセスforループのペアを使用して持つことができます。

for ii = 1 : size(fourDMatrix, 3) 
    for jj = 1 : size(fourDMatrix, 4) 
     slice = fourDMatrix(:, :, ii, jj); 
     % Do your processing here... 
    end 
end 

しかし、私はreshapeを使用することをお勧めすることができた場合、あなたはそれを使用する必要があります。あなたはこのの各スライスは、あなたの4D行列から2Dスライスで、あなたは、単に行う3Dマトリックスを作成するためにreshapeを使用することができます。

slices = reshape(fourDMatrix, size(fourDMatrix, 1), size(fourDMatrix,2), []); 

これは、行と列がされたものと同じである3Dマトリックスを作成します。あなたの4Dマトリックスから。ただし、コードの末尾にある[]は自動的に4D行列を展開し、3番目のディメンションに続いて4番目のディメンションに続いて発生します。基本的には、そこにある3Dマトリクス内にいくつの2Dスライスがあるかを自動的に計算します。例えば、もしあなたの4D行列がslices(:,:,2)A(:,:,2,1);に対応し、slices(:,:,6)A(:,:,2,2)に対応し、上記のコードはslices(:,:,1)A(:,:,1,1)に対応9 x 9 x 16マトリックスを作成し、Aと呼ばれるサイズ9 x 9 x 4 x 4を有していました。一般に、slices(:,:,kk)A(:,:,floor(kk/size(A,2)) + 1, mod(kk,size(A,2)) + 1でスライスにアクセスします。


1:変数名はMATLABの数値で始めることはできません。変数名をfourDMatrixに変更しました。

+1

ありがとう、私はドキュメントからの形を誤解していたと思います。それはまさに私が望んでいたものです。 – emmetbug

+0

全く問題ありません。私は助けることができてうれしい!私はまた、混乱を避けるために '変形 'についていくつかの文章を追加しました。これは、それがどのように機能するかを理解する上で役立ちます。 – rayryeng

関連する問題