Asked 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:

- 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 . .

. . . .

. . . .

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)

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.

seb leaf
on 30 Oct 2019

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

James Tursa
on 30 Oct 2019

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Daniel M (view profile)

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/488343-converting-3d-matrix-to-a-bigger-2d-matrix-efficiently#comment_761820

## Nicolas B. (view profile)

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/488343-converting-3d-matrix-to-a-bigger-2d-matrix-efficiently#comment_761823

Sign in to comment.