MATLAB Answers

0

Converting 3D matrix to a bigger 2D matrix efficiently

Asked by seb leaf on 30 Oct 2019
Latest activity Edited by seb leaf on 30 Oct 2019
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:
  1. 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

I don't see the transformation. What happens to elements A(2,1,:) ? What goes in B(1,3:end)?
Have you checked whether the function reshape() could apply to your case?

Sign in to comment.

Products


Release

R2019b

2 Answers

Answer by Matt J
on 30 Oct 2019
 Accepted Answer

[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

I have to admit that this is one of those times when a simple for loop can be much clearer.
Thank you very much! It's exactly what I wanted.

Sign in to comment.


Answer by Matt J
on 30 Oct 2019
Edited by 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

Also, since the values are being rearranged in memory, a deep data copy is going to be required no matter which method is used.

Sign in to comment.