Combine arrays to form another arrays

1 view (last 30 days)
Hello, can we combine many arrays into another arrays?
for example:
k = 5;
for u=1:k
H(:,:,u)=randn(M,N)+j*randn(M,N);
end
for u=1:k
Hi(:,:,1)=[H(:,:,2);H(:,:,3);H(:,:,4);H(:,:,5)];
Hi(:,:,2)=[H(:,:,1);H(:,:,3);H(:,:,4);H(:,:,5)];
Hi(:,:,3)=[H(:,:,1);H(:,:,2);H(:,:,4);H(:,:,5)];
Hi(:,:,4)=[H(:,:,1);H(:,:,2);H(:,:,3);H(:,:,5)];
Hi(:,:,5)=[H(:,:,1);H(:,:,2);H(:,:,3);H(:,:,4)];
end
what if k=19, should I repeat all the steps. Are there other simpler programs to combine it. Thank you
  1 Comment
Pierre Benoit
Pierre Benoit on 9 Sep 2014
What is the relation between the number of arrays you wish to concatenate each time and k ? Is it always 4, or k-1 or something else ?

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 9 Sep 2014
H = randn(M, N, k) + j*randn(M, N, k); %no need for loop
c = num2cell(H, [1 2]); %split H into cell array along 3rd dimension
for u=1:k
indices = [1:u-1 u+1:k]; %get numbers 1:k without u
Hi(:, :, u) = vertcat(c{indices}); %use cell array to comma separated list expansion to feed vertcat
end

More Answers (1)

Pierre Benoit
Pierre Benoit on 9 Sep 2014
Edited: Pierre Benoit on 9 Sep 2014
M = 5;
N = 5;
k = 5;
H = randn(M, N, k) + j*randn(M, N, k);
permut = nchoosek(1:k,k-1); % Find all permutations
permut = permut(end:-1:1,:); % Flip array
Hi = reshape(permute(reshape(H(:,:,permut'),[M N k-1 k]),[1 3 2 4]),
[M*(k-1) N k]);
Or with a for-loop to be more explicit
Hi = zeros(M*(k-1),N,k); % Pre-allocation
for ii = 1:k-1
Hi(:,:,ii) = reshape(permute(H(:,:,permut(ii,:)),[1 3 2]),[M*(k-1) N]);
end
  1 Comment
Andrei Bobrov
Andrei Bobrov on 9 Sep 2014
variant
M = 4;
N = 3;
k = 5;
H = randn(M, N, k) + 1i*randn(M, N, k);
p = flipud(nchoosek(1:k,k-1));
Tout = permute(reshape(permute(H(:,:,p),[1 3 2]),[],k-1,N),[1 3 2]);

Sign in to comment.

Categories

Find more on Matrices and Arrays 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!