2

画像データをブロックに分割したい。たとえば、X マトリックスが 4*4 の場合、結果を 2*2*2*2 のマトリックス M にしたい。M(1,1,:,:) =X(1:2,1:2) および M(1,2,:,:)=X(1:2,3:4) など

mat2cell を使用してセル配列に分割する方法を見つけましたが、セル配列は matlab ではあまりサポートされていないようです。SO を検索して、通常の行列で簡単に実行できることを行うように依頼します (使用しないことを示唆する回答が得られます)。 cell 配列はまったくありません)。

私はネットとSOを徹底的に検索しました.多くの結果があり、それらすべてが特定の問題を解決するか(ここでは望ましくない方程式の解を見つけるなど)、またはmat2cellを提案することになります.

私が見つけた最も近い結果はreshapeを使用していますreshape(X,[2 2 2 2]).C = 2 * 2 * 2 * 2行列を試してみましたが、C(1,1,:,:)は最初のブロックではなくXの最初の行のようで、できます次に何をすべきかわかりません。

誰かが提案しpermute(C,[1 2 3 4])ましたが、私はまだ私が望む結果を得ていません。

私はまだ matlab の初心者なので、質問が単純である場合はご容赦ください。また、for ループは必要ありません。ベクトル コードが必要です。

編集

その重複した質問の答えを試しましたが、それでも希望する結果が得られません。これらを試しました:

A=ones(40,40);
A(1:10,1:10)=32*ones(10,10);
A(11:20,1:10)=zeros(10,10);    
T = permute(reshape(A, size(A, 1), 10, []), [2 1 3]);  
T = permute(reshape(T, 10, 10, [], size(T, 3)), [2 1 3 4]); 

T は 10*10*4*4 で、まさに私が望むサイズ (40*40 をそれぞれ 4*4 のサブマトリックスのマトリックスに) でしたが、値が間違っています。T(1,1,:,:)~=A(1:4,1:4)

ここで何が間違っていますか?

4

1 に答える 1

0

(4x4 into 2x2x2x2x2)初めての場合

M= permute(reshape(X',[2,2,2,2]),[4,2,3,1]);

一般的な場合 wheresize(X) = a x b)およびsize(M) = c x d x e x fsuch that a*b = c*d*e*f、任意の自然数nに対して を使用します。

M= permute(reshape(X',[c,d,e,f]),[4,2,3,1]);
于 2015-05-19T05:32:50.430 に答える