我只希望Mathworks的人不会起诉你或我,甚至包括Stackoverflow,因为他们对IP工具箱功能设置了价格,试图创建向量化实现。但无论如何,请忘记这些问题,下面是实现方法。
替代使用'sliding'
选项的im2col
在写Stackoverflow上另一个问题的解决方案之前,我无法将其向量化。因此,我强烈建议您也研究一下。
function out = im2col_sliding(A,blocksize)
nrows = blocksize(1);
ncols = blocksize(2);
%// Get sizes for later usages
[m,n] = size(A);
%// Start indices for each block
start_ind = reshape(bsxfun(@plus,[1:m-nrows+1]',[0:n-ncols]*m),[],1); %//'
%// Row indices
lin_row = permute(bsxfun(@plus,start_ind,[0:nrows-1])',[1 3 2]); %//'
%// Get linear indices based on row and col indices and get desired output
out = A(reshape(bsxfun(@plus,lin_row,[0:ncols-1]*m),nrows*ncols,[]));
return;
function out = im2col_distinct(A,blocksize)
nrows = blocksize(1);
ncols = blocksize(2);
nele = nrows*ncols;
row_ext = mod(size(A,1),nrows);
col_ext = mod(size(A,2),ncols);
padrowlen = (row_ext~=0)*(nrows - row_ext);
padcollen = (col_ext~=0)*(ncols - col_ext);
A1 = zeros(size(A,1)+padrowlen,size(A,2)+padcollen);
A1(1:size(A,1),1:size(A,2)) = A;
t1 = reshape(A1,nrows,size(A1,1)/nrows,[]);
t2 = reshape(permute(t1,[1 3 2]),size(t1,1)*size(t1,3),[]);
t3 = permute(reshape(t2,nele,size(t2,1)/nele,[]),[1 3 2]);
out = reshape(t3,nele,[]);
return;
With in-built MATLAB function -
B = im2col(A,[nrows ncols],'sliding')
With our custom function -
B = im2col_sliding(A,[nrows ncols])
%// ------------------------------------
With in-built MATLAB function -
B = im2col(A,[nrows ncols],'distinct')
With our custom function -
B = im2col_distinct(A,[nrows ncols])
im2col
的sliding
选项,它肯定看起来比此处呈现的更好,但正如解决方案中指出的那样,在没有访问IP工具箱时,请使用此选项。 - Divakarbsxfun
的问题在于它需要大量资源。因此,我会猜测对于小型输入来说,使用 bsxfun
会更好,即使与去除了 im2col 版本的方法相比,我也会支持它。但是,如果你要处理更大的输入,你去除了版本可能会更胜一筹。如果你想发布基准测试结果,那会很有趣。 - Divakar