Converting 3D matrix to a bigger 2D matrix efficiently
1 view (last 30 days)
Show older comments
Hello,
Let's say A is a 10x10x4 matrix. A(1,1,:) = a,b,c,d
I want to convert A to B a 20x20 matrix so that: B (1:2,1:2) = [a b;c d];
Is there an efficient way to create the B matrix without using loops?
Cheers!
Edit1: I wrote A as a 10x10x4 matrix, although in reality the matrix's size is around 20 000 x 20 000 x 4.
Edit 2: I reformulated the question:
- A is a huge M x N x 4 matrix
Example:
A = zeros(M,N,4);
A(1,1,:) = [1 1 2 2];
A(2,1,:) = [3 3 4 4];
A(1,2,:) = [5 5 6 6];
A(2,2,:) = [7 7 8 8];
2. Convert A to a regular 2*M x 2*N matrix so that:
Example:
%Desired output:
B =
1 1 5 5 . .
2 2 6 6 . .
3 3 7 7 . .
4 4 8 8 . .
. . . .
. . . .
2 Comments
Daniel M
on 30 Oct 2019
I don't see the transformation. What happens to elements A(2,1,:) ? What goes in B(1,3:end)?
Accepted Answer
Matt J
on 30 Oct 2019
[ma,na,~]=size(A);
B=permute(reshape(A,ma,na,2,2), [4,1,3,2]);
B=reshape(B,2*ma,2*na)
2 Comments
Walter Roberson
on 30 Oct 2019
I have to admit that this is one of those times when a simple for loop can be much clearer.
More Answers (1)
Matt J
on 30 Oct 2019
Edited: Matt J
on 30 Oct 2019
Is there an efficient way to create the B matrix without using loops?
There is nothing inefficient about using loops in this case. Only 4 loop iterations are required.
B=nan(20);
[k,j]=ind2sub([2,2],1:4);
for i=1:4
B( j(i) + (0:2:end-1), k(i) + (0:2:end-1) )=A(:,:,i);
end
1 Comment
James Tursa
on 30 Oct 2019
Also, since the values are being rearranged in memory, a deep data copy is going to be required no matter which method is used.
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!