Filter löschen
Filter löschen

How can I repeat a 2-D array to create a 3-D array?

11 Ansichten (letzte 30 Tage)
Steve Francis
Steve Francis am 12 Jul. 2022
Kommentiert: Voss am 13 Jul. 2022
A is a 2x3 array. I want to create a 3-D 'stack' so that each layer of the 3-D stack is identical to A. I've found that the following code gives the desired result:
A =[1 2 3;4 5 6];
for j=1:5
B(j,:,:)=A;
end
disp (squeeze(B(3,:,:))) % an example showing that any layer of the 3-D array is the same as A
Is there a more elegant way to do this? I tried using repmat but couldn't get the same result.
  5 Kommentare
Steve Francis
Steve Francis am 13 Jul. 2022
Thanks again, James. You're right. Damn, I wish I'd thought about this earlier. I will spend some time seeing if I can re-write my scripts
Stephen23
Stephen23 am 13 Jul. 2022
"That way the 2D slices are contiguous in memory..."
which also means that James Tursa's recommended approach will be more efficient (assuming that you mostly want to access those matrices).

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Bruno Luong
Bruno Luong am 12 Jul. 2022
A =[1 2 3;4 5 6];
B = repmat(reshape(A, [1 size(A)]),[5 1 1])
B =
B(:,:,1) = 1 4 1 4 1 4 1 4 1 4 B(:,:,2) = 2 5 2 5 2 5 2 5 2 5 B(:,:,3) = 3 6 3 6 3 6 3 6 3 6
  2 Kommentare
Steve Francis
Steve Francis am 13 Jul. 2022
Bearbeitet: Steve Francis am 13 Jul. 2022
Thanks very much!
Bruno Luong
Bruno Luong am 13 Jul. 2022
Bearbeitet: Bruno Luong am 13 Jul. 2022
EDIT : my deleted comment moves here
If you do repeat 3rd dimension few other approaches
A =[1 2 3;4 5 6]; N = 2;
B = repmat(A,[1,1,N]), % James's comment
B =
B(:,:,1) = 1 2 3 4 5 6 B(:,:,2) = 1 2 3 4 5 6
B = repelem(A,1,1,N),
B =
B(:,:,1) = 1 2 3 4 5 6 B(:,:,2) = 1 2 3 4 5 6
B = A(:,:,ones(1,N)),
B =
B(:,:,1) = 1 2 3 4 5 6 B(:,:,2) = 1 2 3 4 5 6
B = A + zeros(1,1,N),
B =
B(:,:,1) = 1 2 3 4 5 6 B(:,:,2) = 1 2 3 4 5 6

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Voss
Voss am 12 Jul. 2022
% what you have now:
A =[1 2 3;4 5 6];
for j=1:5
B(j,:,:)=A;
end
% another way, using repmat and permute:
B_new = repmat(permute(A,[3 1 2]),5,1);
% the result is the same:
isequal(B_new,B)
ans = logical
1

Kategorien

Mehr zu Structures finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by