【问题标题】:Accumulate sliding blocks into a matrix将滑块累积成矩阵
【发布时间】:2016-04-21 13:48:44
【问题描述】:

在 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

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

虽然我们可以使用for-loop 轻松实现,但效率极低。那么如何向量化实现呢?

【问题讨论】:

  • 你能举例说明你期望的输出是什么吗?还有你用 for 循环生成它的代码
  • 显示你想要的输出。显示您的代码。将B 改造成A 是微不足道的。我们需要确切地了解您遇到问题的部分。

标签: matlab matrix


【解决方案1】:

如果我理解正确,你想要的输出是

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 where 得到的

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-by-N,而您的滑块的大小是x-by-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]

【讨论】:

  • 有用的答案,但实际上我的意思是在不知道 A 的情况下从 B 获得 C
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多