假设我有以下数组:
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];
最有效的方法是什么?我不想使用cellfun
或arrayfun
或for
循环。
答案 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