Matlab:使用矩阵滑动window
Matlab : Sliding window using a matrix
我需要一些关于如何编程 sliding window of matrix
的信息。
我有一个对角矩阵 B
定义如下:
我想从给定的矩阵 B
和 window W
的大小推导出 t
的不同矩阵,范围从 1
到矩阵的大小 L
。
注意:每个window的宽高是一样的。 window 沿对角线移动。
示例:我们有一个大小为5 by 8
的矩阵,window的大小为3 by 4
并在对角线上移动。例子的矩阵B
为:
我的代码:
% Sliding window matrix
B = [ 1 1 0 0 0 0 0 0
2 2 1 1 0 0 0 0
0 0 2 2 1 1 0 0
0 0 0 0 2 2 1 1
0 0 0 0 0 0 2 2]; % Matrix B
W = 4; % Size of the window wanted here is 4
n = size(B,2) - W + 1;
X = zeros(size(B,1),W*n);
k = W-1:-1:0;
for i = 1:n
window = B(:,i:i+W-1)';
X(:,i*W - k) = B(:,i:i+W-1);
end
window;
将 for 循环的 W = 4
和 n
设置为 1
我得到:
window = [1 2 0 0 0
1 2 0 0 0
0 1 2 0 0
0 1 2 0 0];
而我应该得到:
window = [1 1 0 0
2 2 1 1
0 0 2 2];
使用我的代码,我无法准确地得到通过滑动 window.
获得的不同子矩阵
我希望我的程序能够根据矩阵 B
和我的 window
维度的选择,return 表示 [=28] 的对角矩阵=] 并移动一步以恢复下一个与前一个相同的对角矩阵,依此类推直到结束。
有什么建议吗?
您需要单独指定 window 个维度。试试这个:
B = [ 1 1 0 0 0 0 0 0
2 2 1 1 0 0 0 0
0 0 2 2 1 1 0 0
0 0 0 0 2 2 1 1
0 0 0 0 0 0 2 2];
[bh, bw] = size(B); % matrix size
wh = 3; % window height
ww = 4; % window width
sx = 2; % sliding step length along 2nd dim
sy = 1; % sliding step length along 1st dim
wx = 1:sx:(bw-ww+1); % window left
wy = 1:sy:(bh-wh+1); % window top
n = min(numel(wx), numel(wy)); % number of windows which fit in matrix
for ii = 1:n
X = B((1:wh)+wy(ii)-1, (1:ww)+wx(ii)-1)
end
请注意,如您的问题中所述,滑动 window 不一定会访问整个矩阵对角线。除非你根据矩阵的维度计算sx
和sy
。
B = randi(3, [8 13])
[bh, bw] = size(B); % matrix size
wh = 3; % window height
ww = 4; % window width
sx = 3; % slideing step length along 2nd dim
sy = 1; % slideing step length along 1st dim
我需要一些关于如何编程 sliding window of matrix
的信息。
我有一个对角矩阵 B
定义如下:
我想从给定的矩阵 B
和 window W
的大小推导出 t
的不同矩阵,范围从 1
到矩阵的大小 L
。
注意:每个window的宽高是一样的。 window 沿对角线移动。
示例:我们有一个大小为5 by 8
的矩阵,window的大小为3 by 4
并在对角线上移动。例子的矩阵B
为:
我的代码:
% Sliding window matrix
B = [ 1 1 0 0 0 0 0 0
2 2 1 1 0 0 0 0
0 0 2 2 1 1 0 0
0 0 0 0 2 2 1 1
0 0 0 0 0 0 2 2]; % Matrix B
W = 4; % Size of the window wanted here is 4
n = size(B,2) - W + 1;
X = zeros(size(B,1),W*n);
k = W-1:-1:0;
for i = 1:n
window = B(:,i:i+W-1)';
X(:,i*W - k) = B(:,i:i+W-1);
end
window;
将 for 循环的 W = 4
和 n
设置为 1
我得到:
window = [1 2 0 0 0
1 2 0 0 0
0 1 2 0 0
0 1 2 0 0];
而我应该得到:
window = [1 1 0 0
2 2 1 1
0 0 2 2];
使用我的代码,我无法准确地得到通过滑动 window.
获得的不同子矩阵我希望我的程序能够根据矩阵 B
和我的 window
维度的选择,return 表示 [=28] 的对角矩阵=] 并移动一步以恢复下一个与前一个相同的对角矩阵,依此类推直到结束。
有什么建议吗?
您需要单独指定 window 个维度。试试这个:
B = [ 1 1 0 0 0 0 0 0
2 2 1 1 0 0 0 0
0 0 2 2 1 1 0 0
0 0 0 0 2 2 1 1
0 0 0 0 0 0 2 2];
[bh, bw] = size(B); % matrix size
wh = 3; % window height
ww = 4; % window width
sx = 2; % sliding step length along 2nd dim
sy = 1; % sliding step length along 1st dim
wx = 1:sx:(bw-ww+1); % window left
wy = 1:sy:(bh-wh+1); % window top
n = min(numel(wx), numel(wy)); % number of windows which fit in matrix
for ii = 1:n
X = B((1:wh)+wy(ii)-1, (1:ww)+wx(ii)-1)
end
请注意,如您的问题中所述,滑动 window 不一定会访问整个矩阵对角线。除非你根据矩阵的维度计算sx
和sy
。
B = randi(3, [8 13])
[bh, bw] = size(B); % matrix size
wh = 3; % window height
ww = 4; % window width
sx = 3; % slideing step length along 2nd dim
sy = 1; % slideing step length along 1st dim