私は巨大な4D行列を持っており、2D行列にスライスする必要があります。これは、手動で一つずつこれを実行するのは簡単です:4D行列を2DスライスにスライスするMatLab
slice1 = 4dmatrix(:,:,1,1)
slice2 = 4dmatrix(:,:,1,2)
など が、私は、この使用してループを行う方法を動作することはできません。これまで見たことのあるものは、元のマトリックスを再構成しています(これは私が望むものではありません)。
私は巨大な4D行列を持っており、2D行列にスライスする必要があります。これは、手動で一つずつこれを実行するのは簡単です:4D行列を2DスライスにスライスするMatLab
slice1 = 4dmatrix(:,:,1,1)
slice2 = 4dmatrix(:,:,1,2)
など が、私は、この使用してループを行う方法を動作することはできません。これまで見たことのあるものは、元のマトリックスを再構成しています(これは私が望むものではありません)。
あなたは単純に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
に変更しました。
だから正確に何をしたいですか?各スライスがこの4Dマトリックスの2Dスライスである3Dマトリックスを作成しますか?希望の出力は何ですか? – rayryeng
'ii'と' jj'をループする 'D4matrix(:、:、ii、jj)'ループでこのようにインデックスを作成します。すべての2Dスライスを個別に作成しないでください。これは[動的変数命名法](http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170)と呼ばれています。プログラミングの習慣が悪いまた、変数名は数字で始めることができないので、実際にあなたの行列 '4dmatrix'に名前をつけることはできません。 – Adriaan