我正在尝试为输入维度编写自己的im2col算法> 2D。 目前我正在研究Matlab im2col的实现。但是,我找不到任何关于超过2维的任何输入的内容的文档。
如果我将3D张量输入函数,我会得到一个输出。但是,我真的不明白你是如何从2D到ND的。事实上,文档中没有提到它表明它是直截了当的,但是,我还没有得到它。
哎呀,我甚至不明白为什么输出矩阵的大小是它的大小。
答案 0 :(得分:1)
首先我要说im2col
仅适用于2D矩阵。事实上,它有时是有效的(我的意思是返回一个结果而不会抛出错误)只是一个快乐的巧合。
现在我看了edit im2col.m
,并且没有过多地研究代码,每个distinct
和sliding
方法的第一行应该让你直截了当地发生了什么:
...
if strcmp(kind, 'distinct')
[m,n] = size(a);
...
elseif strcmp(kind,'sliding')
[ma,na] = size(a);
...
end
...
首先回想一下[s1,s2] = size(arr)
其中arr
是一个3d数组会将第二维和第三维的大小合并为一个大小。这是相关的doc size
:
[d1,d2,d3,...,dn] = size(X)
返回数组X
的维度大小,前提是输出参数n
的数量等于ndims(X)
。如果n < ndims(X)
,di
等于X
的{{1}}的第i维的大小,则0<i<n
等于dn
的剩余维度的大小的乘积{1}},即维度X
到n
。
所以基本上对于大小为ndims(X)
的数组,函数会认为它是一个大小为M-by-N-by-P
的矩阵。现在,MATLAB有一些古怪的索引规则,可以让你做到这样的事情:
M-by-(N*P)
这是我认为最终发生的事情。以下是确认>> x = reshape(1:4*3*2,4,3,2)
x(:,:,1) =
1 5 9
2 6 10
3 7 11
4 8 12
x(:,:,2) =
13 17 21
14 18 22
15 19 23
16 20 24
>> x(:,:)
ans =
1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24
在RGB图像上的行为的示例:
im2col
请注意,% normal case (grayscale image)
>> M = magic(5);
>> B1 = im2col(M, [3 3], 'sliding');
% (RGB image)
>> MM = cat(3, M, M+50, M+100);
>> B2 = im2col(MM, [3 3], 'sliding');
>> B3 = im2col(reshape(MM, [5 5*3]), [3 3], 'sliding');
>> assert(isequal(B2,B3))
和B2
相同,所以基本上认为数组B3
上im2col
的结果与arr = cat(3,R,G,B)
的结果相同(水平连接)。
有趣的是,使用“distinct”块方法你不会那么幸运:
arr = cat(2,R,G,B)
现在我们已经了解了发生了什么,让我们考虑如何正确地为3D阵列做这件事。
在我看来,为彩色图像实现>> B1 = im2col(M, [3 3], 'distinct') % works
% ..snip..
>> B2 = im2col(MM, [3 3], 'distinct') % errors
Subscripted assignment dimension mismatch.
Error in im2col (line 59)
aa(1:m,1:n) = a;
,我会分别在每个颜色通道上运行它(每个都是一个2d矩阵),并沿第三维连接结果。所以像这个包装函数:
im2col