高效的“窗口选择”数组块?

时间:2016-06-14 12:25:12

标签: arrays matlab select

假设我有以下数组:

x = [a b
     c d
     e f
     g h
     i j];

我希望沿着数组逐步(一次一行)“刷两行窗口”以生成以下数组:

y = [a b c d e f g h
     c d e f g h i j];

最有效的方法是什么?我不想使用cellfunarrayfunfor循环。

3 个答案:

答案 0 :(得分:4)

如果你有图像处理工具箱,

im2col将是你最好的选择。

x = [1 2
     3 4
     5 6
     7 8];

im2col(x.', [1 2])
%   1     2     3     4     5     6
%   3     4     5     6     7     8

如果您没有图像处理工具箱,也可以使用内置插件轻松完成此操作。

reshape(permute(cat(3, x(1:end-1,:), x(2:end,:)), [3 2 1]), 2, [])
%   1     2     3     4     5     6
%   3     4     5     6     7     8

通过沿第三维连接行移位版本,将所有行与下一行组合在一起。然后我们使用permute来移动尺寸,然后我们将其重新塑造为所需的尺寸。

答案 1 :(得分:3)

如果您没有图像处理工具箱,可以使用简单的索引来执行此操作:

x =
     1     2
     3     4
     5     6
     7     8
     9    10

y = x.';                      %% Transpose it, for simplicity
z = [y(1:end-2); y(3:end)]    %% Take elements 1:end-2 and 3:end and concatenate them
z =
     1     2     3     4     5     6     7     8
     3     4     5     6     7     8     9    10

您可以通过一个简单的步骤进行移调和整形(参见Suever的编辑),但上面的内容可能更易于阅读,理解和调试。

答案 2 :(得分:2)

这是解决每个窗口选择L行的一般情况的方法 -

[m,n] = size(x) % Store size

% Extend rows by indexing into them with a progressive array of indices 
x_ext = x(bsxfun(@plus,(1:L)',0:m-L),:);

% Split the first dim at L into two dims, out of which "push" back the 
% second dim thus created as the last dim. This would bring in the columns 
% as the second dimension. Then, using linear indexing reshape into the 
% desired shape of L rows for output.
out = reshape(permute(reshape(x_ext,L,[],n),[1,3,2]),L,[])

示例运行 -

x =                  % Input array
     9     1
     3     1
     7     5
     7     8
     4     9
     6     2
L =                  % Window length
     3
out =
     9     1     3     1     7     5     7     8
     3     1     7     5     7     8     4     9
     7     5     7     8     4     9     6     2