二次元配列から特定形​状の二次元配列を取り​出す方法 (例 4x​4 → 2x2x4等)

13 次查看(过去 30 天)
K.S.
K.S. 2020-11-27
评论: K.S. 2020-11-30
画像処理を行う一環で、以下のような二次元配列(画像)から特定サイズの配列抽出をfor loopを用いずに行いたいです。
上記のようなことはfor loopを利用すればできるのはわかりますが、これらをfor loopを用いずに抽出することは可能でしょうか?
4x4 を2x2x4のように。

采纳的回答

Shunichi Kusano
Shunichi Kusano 2020-11-27
こんにちは。
もっといい方法があるかもしれませんが、im2col関数とreshape関数を組合わせる方法がわかりやすいかなと思いました。
A = [1 1 2 2;1 1 2 2;3 3 4 4;3 3 4 4]
im2col(A,[2 2],'distinct') % どういう出力になるか見てみてください
reshape(im2col(A,[2 2],'distinct'),[2 2 4]) % im2colの出力をさらに並べ替えて、ご所望の形にしています。
ただこのやり方ですと3次元目が1 3 2 4の順で出力される(行方向がデフォルトの優先順位)ので、もし1 2 3 4の順にしたい場合は、処理前に
A = A';
で転置することになるかなと思います。
  3 个评论
Akira Agata
Akira Agata 2020-11-28
こんばんは。
たまたま別の方法を思いついたので、ご参考までに紹介します。
A = [1 1 2 2;1 1 2 2;3 3 4 4;3 3 4 4];
% 2×2の配列に分割
c = mat2cell(A,[2 2],[2 2]);
% 並べ替え
c = reshape(c,1,1,4);
% 数値配列に変換
B = cell2mat(c);
こちらも、このままではBの3次元目が1 3 2 4の順で出力されますので、もし1 2 3 4の順にしたい場合は、処理前に配列Aを転置させてみてください。
K.S.
K.S. 2020-11-30
なるほど!
mat2cellでは、arrayが直接分割される事を利用しているのですね。
大変勉強になります。
ご回答ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 行列および配列 的更多信息

产品


版本

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!