3

明けましておめでとうございますSOメンバー!

幸運を祈って、新年の私の最初の投稿!:D

サイズが100、100、100、3の4D行列Xがあります。X(51、:、51、:)でその部分行列を抽出し、結果が100x32D行列になることを期待します。しかし、いいえ、結果はサイズ= 1、100、1、3の4D行列になります。どうしてですか?

さらに紛らわしい結果は次のとおりです。

  • plot(X(51、:、51、i))とplot(X(:、51,51、i))をi = 1、2、3で使用できます。

  • 同じiでplot(X(51,51、:、i))を使用することはできません

つまり、MATLABの部分行列抽出では、行列のサイズが縮小されませんか?そして、異なるサブアクセスは異なる動作をします。つまり、最後の次元にもっと注意を払いますか?

ありがとうございました!

Edit01:

便宜上、ここにシングルトンとスクイーズを使用してテスト結果を表示します。 サブマトリックスアクセス

スクイーズの使用:

絞った

4

1 に答える 1

3

お気づきのように、100 by 100 by 100 by 3マトリックスにインデックスを(51, :, 51, :)付けると、 size の結果が返されます[1 100 1 3]。の次元は、シングルトンsize = 1次元と呼ばれます。

MATLAB は、後続のシングルトン次元を自動的に削除しません (2D 行列を超える場合) 。これらの次元を削除するには、 squeezeを使用します。最後の次元がシングルトンの場合、これは自動的に処理されます。

だからあなたの場合、あなたは持っています

X = zeros(100,100,100,3);
Y = X(51,:,51,:); #% size(Y) = [1 100 1 3];
Y2 = squeeze(X(51,:,51,:)); #% size(Y2) = [100 3] - singletons removed

P1 = X(51,:,51,1); #% size(P1) = [1 100 1 1] which becomes [1 100] (2D)
P2 = X(51,51,:,1); #% size(P2) = [1 1 100 1] which becomes [1 1 100] (3D)
于 2013-01-01T05:17:06.330 に答える