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 个评论
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
Are you sure you aren't just trying to do a convolution? There are efficient function for that.
Mehdi Kooli
2022-11-7
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
2022-11-7
Mehdi Kooli
2022-11-23
移动:Matt J
2022-11-23
Mehdi Kooli
2022-12-9
移动:Matt J
2022-12-9
回答(2 个)
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)
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)
There are 12 such sub-arrays.
B(:,:,1)
B(:,:,2)
B(:,:,12)
5 个评论
Mehdi Kooli
2022-11-7
移动:Stephen23
2022-11-7
Mehdi Kooli
2022-11-10
"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
2022-12-12
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
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.
类别
在 帮助中心 和 File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!