Is there an alternative way to perform the following matrix transformation?

1 view (last 30 days)
Is there a better way to perform the following operation.
For example, for the following matrix:
A =
1 13 25
2 14 26
3 15 27
4 16 28
5 17 29
6 18 30
7 19 31
8 20 32
9 21 33
10 22 34
11 23 35
12 24 36
I am looking to transform to:
A_new =
1 13 25 2 14 26 3 15 27
2 14 26 3 15 27 4 16 28
3 15 27 4 16 28 5 17 29
Note, I am combining groups of three rows in a row for the entired matrix.
The following piece of code is already able to perform this. However, I have a huge matrix, and I believe there is an optimal way to do this. Also, I would like to play aroung with the number of rows to create the new matrix.
% Matrix A
A=1:36; A = reshape(A,12,3)
j=1;
for i=1:3
A_new(i,:) = [A(j,:) A(j+1,:) A(j+2,:)];
j = j +1;
end
A_new

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 22 Nov 2019
Edited: Andrei Bobrov on 22 Nov 2019
i = 3;
[m,n] = size(A);
j = hankel(1:i,i:m);
out = A(sub2ind([m,n],kron(j,ones(1,n)),repmat(1:n,i,m-n+1)));
or in your case
j = hankel(1:i,i:2*i-1);
out = A(sub2ind([m,n],kron(j,ones(1,i)),repmat(1:n,i,i)));
or for out:
out = reshape(permute(reshape(A(j,:),i,n,[]),[1,3,2]),i,[]);

More Answers (1)

Stephen23
Stephen23 on 22 Nov 2019
Edited: Stephen23 on 22 Nov 2019
>> N = 3;
>> [R,C] = size(A); % specify R to change the number of rows of A used.
>> X = hankel(1:N,N:R);
>> B = reshape(A(X,:).',N*C,[]).'
B =
1 13 25 2 14 26 3 15 27
2 14 26 3 15 27 4 16 28
3 15 27 4 16 28 5 17 29
4 16 28 5 17 29 6 18 30
5 17 29 6 18 30 7 19 31
6 18 30 7 19 31 8 20 32
7 19 31 8 20 32 9 21 33
8 20 32 9 21 33 10 22 34
9 21 33 10 22 34 11 23 35
10 22 34 11 23 35 12 24 36

Categories

Find more on Operating on Diagonal Matrices 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!