【问题标题】:Getting all submatrices获取所有子矩阵
【发布时间】:2012-11-22 14:53:21
【问题描述】:

我有一个 N×M 矩阵 m 像:

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

我想得到 所有 个大小为 P×Q(P,Q 是奇数)的子矩阵,不使用 for 循环。

结果s应该是一个P×Q×((N-P+1)·(M-Q+1))矩阵。

例如如果 P=Q=3:

s(:,:,1) = [1 2 3;  5  6  7;  9 10 11]
s(:,:,2) = [2 3 4;  6  7  8; 10 11 12]
s(:,:,3) = [5 6 7;  9 10 11; 13 14 15]
s(:,:,4) = [6 7 8; 10 11 12; 14 15 16]

【问题讨论】:

  • 为什么会有倍数?例如。 5 6 7 出现两次。
  • @Jonas 抱歉,我的例子令人困惑。现在更容易理解了吗?
  • 不,我还是不太明白:为什么要重复条目?只是为了让你可以填满你的数组?另外,你看过我的解决方案了吗?

标签: matlab vectorization submatrix


【解决方案1】:

im2col 可以在这里为您提供帮助:

m =
     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

>> P = 3; Q = 3;
>> columnized = im2col(m,[P Q],'sliding');
>> nMatrices = size(columnized,2);
>> s = reshape(columnized, [P Q nMatrices])

s(:,:,1) =
     1     2     3
     5     6     7
     9    10    11
s(:,:,2) =
     5     6     7
     9    10    11
    13    14    15
s(:,:,3) =
     2     3     4
     6     7     8
    10    11    12
s(:,:,4) =
     6     7     8
    10    11    12
    14    15    16

im2col'sliding' 选项查找所有重叠子矩阵,并将每个子矩阵作为columnized 中的(P·Q) 元素列向量返回。要将这些转换回矩阵,我们将reshape 这个 (P·Q)×((N-P+1)·(M-Q+1)) 矩阵转换为 P×Q×((N-P+1) ·(M-Q+1)) 一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多