how rearrange data in a matrix?

2 views (last 30 days)
Ved
Ved on 19 Oct 2013
Commented: Andrei Bobrov on 20 Oct 2013
I have a data as:
data=[1 2 3 4 5 6 7 8];
I need a new data matrix (4 x 8),like this:
new_data =[ 1 2 0 0 0 0 0 0
0 0 3 4 0 0 0 0
0 0 0 0 5 6 0 0
0 0 0 0 0 0 7 8 ]
How to do it using a FOR loop ? Any help?

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 19 Oct 2013
Edited: Azzi Abdelmalek on 19 Oct 2013
data=[1 2 3 4 5 6 7 8];
n=numel(data);
R=zeros(n/2,n);
R(:,1:2)=reshape(data,2,[])';
out=cell2mat(arrayfun(@(x) circshift(R(x+1,:),[ 0 2*x]),(0:3)','un',0))
%or
data=[1 2 3 4 5 6 7 8];
n=numel(data);
out=zeros(n/2,n);
out(sub2ind(size(out),repmat((1:n/2),2,1),reshape(1:n,2,[])))=data
%or
EDIT
n=numel(data);
a=[reshape(data,2,[]) ;zeros(n,n/2)];
a=a(:);
a(end-n+1:end)=[];
out=reshape(a,n,n/2)'
  2 Comments
Ved
Ved on 19 Oct 2013
@Azzi: First two scripts worked perfectly.Thank you !
Ved
Ved on 19 Oct 2013
@Azzi:
Could you please explain the line which is using cell2mat() in your first code.

Sign in to comment.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 19 Oct 2013
Edited: Andrei Bobrov on 20 Oct 2013
a = num2cell(reshape(data,1,2,[]),[1 2])
out = blkdiag(a{:});
or
out = kron(eye(4),[1 1])*diag(data);
or
out = reshape(permute(repmat(eye(4),[1,1,2]),[1 3 2]),4,[])*diag(data);
  2 Comments
Ved
Ved on 20 Oct 2013
Edited: Ved on 20 Oct 2013
@Andrei:
Thank You ! but third one is giving an error:
Error using repmat
Too many input arguments.
nevertheless other two options works perfectly.

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!