필터 지우기
필터 지우기

Extract submatrix using a sliding window

조회 수: 6 (최근 30일)
Gianluca Ligresti
Gianluca Ligresti 2018년 12월 6일
댓글: Jos (10584) 2018년 12월 7일
Hi all,
I have a matrix A = [1,2,3;
4,5,6;
7,8,9;
10,11,12;
13,14,15];
I want to derive a second matrix, called A1, which has all the submatrices obtained through a sliding Window W = 2 and a shift delta = 1. I mean, starting from the A above I want to obtain something like:
A1 = [1,2,3;
4,5,6;
4,5,6;
7,8,9;
7,8,9;
10,11,12;
10,11,12;
13,14,15]
I need to do this procedure for a very large matrix A (200.000 rows x 300 columns), is there a way you can suggest me with a good response time from matlab?
Thanks
  댓글 수: 2
Guillaume
Guillaume 2018년 12월 6일
편집: Guillaume 2018년 12월 6일
I do not understand how A1 matches your description. With a window of size 2, I'd expect 2x2 submatrices. Maybe,
A1 = cat(3, [1 2; 4 5], [2 3; 5 6], [4 5;7 8], etc.)
but certainly not the A1 you describe.
With a 200,000 x 300 matrix, have you calculated how many submatrices this would generate and how much memory that would require? Do you actually need to store these submatrices. You'll just be storing extremely redundant information.
Gianluca Ligresti
Gianluca Ligresti 2018년 12월 6일
편집: Gianluca Ligresti 2018년 12월 6일
Starting from A I need to take the first two rows and make some processing over them, then on the next iteration I have to shift of 1, so I take the second and third row of A and make the same processing and so on, till I end the rows of A.
I tried to use a for loop that considers only two rows for each time but, obviously, from the fact that my Matrix has an high number of rows my Matlab need lots of minutes.
My problem is a time problem, because with the matrix A of my example I'm able to extract, step by step, the two rows I need.
The processing for each couple of row takes up less than 1 second, but I need to compare what I obtain with a window W = 2 and with a window W = 1000. So, when W = 1000 I take at the first iteration the rows from 1 to 1000, i make my processing, then the rows from 2 to 1001, i make my processing and so forth...but with a for loop, to do this with 200.000 rows, I never finish at all.

댓글을 달려면 로그인하십시오.

답변 (2개)

Guillaume
Guillaume 2018년 12월 6일
I don't see how replicating the rows is going to save you time. You're just using more memory to store the same information. However, if it's what you want to do, your A1 is easily obtained, at least for your window of height 2 with shift of 1:
A1 = repelem(A, 2, 1); %replicate each row twice, don't replicate columns
A1 = A1(2:end-1)
For a larger window height (but still shift of 1), you can get your matrix with im2col which requires the image processing toolbox:
A1 = reshape(im2col(A.', [size(A, 2), windowheight]), size(A, 2), []).'
However, this would probably take more time than your existing loop.
For a shift > 1, you probably need to use a loop, which would take as much time as your existing loop.
  댓글 수: 5
Guillaume
Guillaume 2018년 12월 7일
Well, as I keep saying, I don't see the point of that precomputation step. Unless the processing itself can be carried out without a loop, it's not going to give you any speed advantage. If anything you may be doing twice as much wore and you're certainly storing redundant information. Even Jos' method of precomputing the indices is not going to make any significant difference. The expensive part of your loop is the processing, not the calculation of the submatrices.
So, I think you're focusing on the wrong part of the problem. What may needs optimising is that computation you do on the submatrices.
Jos (10584)
Jos (10584) 2018년 12월 7일
+1 Guillaume

댓글을 달려면 로그인하십시오.


Jos (10584)
Jos (10584) 2018년 12월 7일
My advise: create the proper index vector from windowsize and shift and use that to extract the rows
A = [1 2 3; 4 5 6 ; 7 8 9 ; 10 11 12 ; 13 14 15]
windowsize = 3
shift = 2
N = size(A,1)
ix = (1:shift:N) + (0:windowsize-1).'
ix = ix(ix<=N)
B = A(ix,:)
  댓글 수: 1
Jos (10584)
Jos (10584) 2018년 12월 7일
for N = 1e5, windowsize = 5000 and shift = 10, this takes a second on my old mac :-D

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by