在MATLAB中,我们可以使用im2col
和col2im
从列转换为块并返回,例如
>> 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)*2
,C(2,2) = A(2,2)*4
虽然我们可以使用for
循环轻松实现,但效率非常低。那么如何对实现进行矢量化呢?
答案 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=4
,N=6
,x=2
和y=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]