将滑块累积到矩阵中

时间:2016-04-21 13:48:45

标签: matlab matrix

在MATLAB中,我们可以使用im2colcol2im从列转换为块并返回,例如

>> A = floor(30*rand(4,6))

A =

     8     5     2    13    15    11
    22    11    27    13    24    24
     5    18    23     9    23    15
    20    23    14    15    19    10

>> B = im2col(A,[2 2],'distinct')

B =

     8     5     2    23    15    23
    22    20    27    14    24    19
     5    18    13     9    11    15
    11    23    13    15    24    10

>> col2im(B,[2 2],[4,6],'distinct')

ans =

     8     5     2    13    15    11
    22    11    27    13    24    24
     5    18    23     9    23    15
    20    23    14    15    19    10

我的问题是:在滑动模式下使用im2col

>> B = im2col(A,[2 2],'sliding')

B =

     8    22     5     5    11    18     2    27    23    13    13     9    15    24    23
    22     5    20    11    18    23    27    23    14    13     9    15    24    23    19
     5    11    18     2    27    23    13    13     9    15    24    23    11    24    15
    11    18    23    27    23    14    13     9    15    24    23    19    24    15    10

我希望从B获得 4 -by- 6 矩阵 C (不知道A)每个站点的值等于原始值乘以采样次数。 换句话说,C(1,1)=A(1,1)C(1,2)=A(1,2)*2C(2,2) = A(2,2)*4

虽然我们可以使用for循环轻松实现,但效率非常低。那么如何对实现进行矢量化呢?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要输出

C = [  8    10     4    26    30    11
      44    44   108    52    96    48
      10    72    92    36    92    30
      20    46    28    30    38    10 ]

我通过计算C = A.*S其中

得到的
S = [ 1     2     2     2     2     1
      2     4     4     4     4     2
      2     4     4     4     4     2
      1     2     2     2     2     1 ]_

S中的条目表示每个条目所属的滑块数。

我相信您的问题归结为如何构建矩阵S


解决方案:

S = min(min(1:M,M:-1:1),x)'*min(min(1:N,N:-1:1),y)
C = A.*S

其中A的大小为M - 按 - N,您的滑动块大小为x - 按 - y


说明:

在给定示例中,M=4N=6x=2y=2。 请注意,解决方案S可以写为两个向量的外积:

S = [1;2;2;1] * [1,2,2,2,2,1]

我们使用M,N,x,y

的值构建这两个向量中的每一个
min(1:M,M:-1:1)' == min(1:4,4:-1:1)'
                 == min([1,2,3,4], [4,3,2,1])'
                 == [1,2,2,1]'
                 == [1;2;2;1]

在这种情况下,额外的min(...,x)不执行任何操作,因为所有条目都已<=x

min(1:N,N:-1:1)  == min(1:6,6:-1:1)
                 == min([1,2,3,4,5,6],[6,5,4,3,2,1])
                 == [1,2,3,3,2,1]

这次额外的min(...,y)很重要。

min(min(1:N,N:-1:1),y) == min([1,2,3,3,2,1],y)
                       == min([1,2,3,3,2,1],2)
                       == [1,2,2,2,2,1]