Split big matrix in many submatrices having same size

Hello,
I have a big matrix 396*2600 and I want to split it to many matrices 30*120 as follow : (let's consider this exemple on a small matrix A ans split it to 3*2 matrices):
A = [1 9 17
2 10 18
3 11 19
4 12 20
5 13 21
6 14 22
7 15 23
8 16 24];
results wanted: A1 = [1 9
2 10
3 11]
A2 = [9 17
10 18
11 19]
A3 = [2 10
3 11
4 12]
A3 = [10 18
11 19
12 20] and so on ...
Remarks: I need a solution without for loop, I'm looking for a Matlab command giving this results.
Thanks

6 件のコメント

Matt J
Matt J 2022 年 11 月 4 日
編集済み: Matt J 2022 年 11 月 4 日
I have a big matrix 396*2600 and I want to split it to many matrices 30*120 as follow
Seems like a bad idea. That will consume approximately 25GB of RAM if you store the results as doubles:
30*120*(396-(30-1))*(2600-(120-1))*8/2^30
ans = 24.4222
Are you sure you aren't just trying to do a convolution? There are efficient function for that.
Mehdi Kooli
Mehdi Kooli 2022 年 11 月 7 日
Hello @Matt J
What I'm trying to do is to split the matrix to submatrices and then for each submatrix, calculate the median value and store the result in another matrix.
Stephen23
Stephen23 2022 年 11 月 7 日
"What I'm trying to do is to split the matrix to submatrices and then for each submatrix, calculate the median value and store the result in another matrix. "
Then you should ask about that, not about your attempted anti-pattern solution:
Explain clearly what your actual goal is. Do you have the image processing toolbox?
Mehdi Kooli
Mehdi Kooli 2022 年 11 月 7 日
@Stephen23 I have the Image processing toolbox
I already did all the calculation and it's correct using for loops, what I'm doing know is to replace the for loops by another method in order to optimize the calculation time
Mehdi Kooli
Mehdi Kooli 2022 年 11 月 23 日
移動済み: Matt J 2022 年 11 月 23 日
Hello Andrei Bobrov, I saw you answered similar question (https://fr.mathworks.com/matlabcentral/answers/357482-reshaping-a-2d-matrix-into-a-3d-matrix-layers-of-square-matrices-with-specific-order-no-loop?s_tid=srchtitle)
Can you please take a look here , maybe you have the solution.
Mehdi Kooli
Mehdi Kooli 2022 年 12 月 9 日
移動済み: Matt J 2022 年 12 月 9 日
Hello @Andrei Bobrov maybe you have the answer ?

サインインしてコメントする。

回答 (2 件)

John D'Errico
John D'Errico 2022 年 11 月 4 日
編集済み: John D'Errico 2022 年 11 月 4 日

0 投票

So many times this gets asked for. DON'T DO IT. Instead, learn to use arrays, of many types. For example, just make it into a 3 dimensional array, where each plane of that array is one of the desired sub-arrays. That requires relatively little more than understanding how to index arrays.
A = [1 9 17
2 10 18
3 11 19
4 12 20
5 13 21
6 14 22
7 15 23
8 16 24];
Here you want to generate all 3x2 contiguous subarrays. The size of A is
[r,c] = size(A)
r = 8
c = 3
So there will be 6*2 such 3x2 sub-arrays to generate.
Where are the elements of A stored in memory? In what order? Understanding this, and how tools like sub2ind work in MATLAB allows you to build these arrays easily.
ind1 = (1:3)' + [0,r];
ind2 = (1:r-2) + r*[0:c-2]';
B = reshape(A(ind1(:)-1 + ind2(:)'),3,2,[]);
Now it is simple to acces any of those subarrays as we have created, and do so programmatically. The array B is of size:
size(B)
ans = 1×3
3 2 12
There are 12 such sub-arrays.
B(:,:,1)
ans = 3×2
1 9 2 10 3 11
B(:,:,2)
ans = 3×2
9 17 10 18 11 19
B(:,:,12)
ans = 3×2
14 22 15 23 16 24

5 件のコメント

Mehdi Kooli
Mehdi Kooli 2022 年 11 月 7 日
移動済み: Stephen23 2022 年 11 月 7 日
Can you please explain these two steps :
ind1 = (1:3)' + [0,r];
ind2 = (1:r-2) + r*[0:c-2]';
I have an error : Error using + Matrix dimension must agree
Mehdi Kooli
Mehdi Kooli 2022 年 11 月 10 日
Can you answer my question please ?
Can you please explain these two steps :
ind1 = (1:3)' + [0,r];
ind2 = (1:r-2) + r*[0:c-2]';
I have an error : Error using + Matrix dimension must agree
Thanks
Stephen23
Stephen23 2022 年 12 月 9 日
編集済み: Stephen23 2022 年 12 月 12 日
"I have an error : Error using + Matrix dimension must agree"
John D'Errico's answer uses explicit arithmetic expansion, which was introduced in R2016b:
Your MATLAB version (R2015b) does not support explicit arithmetic expansion, so you need to replace the subtraction operations(and possibly others) with BSXFUN() and MINUS().
Mehdi Kooli
Mehdi Kooli 2022 年 12 月 12 日
@Stephen23 Thanks a lot, it resolves the problem for this example but I need to adapt the code for a big matrix A= 426 x 2904 using a sliding window 60 x 240
I don't understand the value 2 in the code (see comments below)
Here is the code :
rect_l=3; % rows lenght of my sliding window
rect_c=2; % columns lenght of my sliding window
% Matrix example 8 x 3
A = [1 9 17
2 10 18
3 11 19
4 12 20
5 13 21
6 14 22
7 15 23
8 16 24];
[r,c] = size(A);
x1 = (1:rect_l)';
y1 = [0,r];
ind1 = bsxfun(@plus,x1,y1);
x2 = (1:r-2); % Why the value 2 ?
y2 = r*[0:c-2]'; % Why the value 2 ?
ind2 = bsxfun(@plus,x2,y2);
ind3 = bsxfun(@minus,ind1(:),1);
ind4 = ind2(:)';
ind5 = bsxfun(@plus,ind3,ind4);
B = reshape(A(ind5),rect_l,rect_c,[]);
Can you please tell me how to modify the code for the new Matrix size and sliding window.
Jilin Zhang
Jilin Zhang 2022 年 12 月 21 日
A=randi([0 10],426,2904)
[r1, c1]=size(A);
r2=60 %target row #
c2=240 %target column #
i=1
j=1
k=1
while i*r2<r1
while j*c2<c1
B(k,:,:)=A((i-1)*r2+1:i*r2,(j-1)*c2+1:j*c2);
j=1+j
k=1+k
end
i=1+i
end

サインインしてコメントする。

Matt J
Matt J 2022 年 11 月 7 日
編集済み: Matt J 2022 年 11 月 7 日

0 投票

What I'm trying to do is to split the matrix to submatrices and then for each submatrix, calculate the median value and store the result in another matrix.
The problem simplifies greatly if you choose a submatrix size with odd dimensions, in which case you can use medfilt2. Otherwise, ordfilt2 would allow you the increased flexibility of using any dimensions.

カテゴリ

ヘルプ センター および File ExchangeResizing and Reshaping Matrices についてさらに検索

製品

リリース

R2015b

質問済み:

2022 年 11 月 4 日

コメント済み:

2022 年 12 月 21 日

Community Treasure Hunt

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

Start Hunting!

Translated by