how rearrange data in a matrix?

1 Ansicht (letzte 30 Tage)
Ved
Ved am 19 Okt. 2013
Kommentiert: Andrei Bobrov am 20 Okt. 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?

Akzeptierte Antwort

Azzi Abdelmalek
Azzi Abdelmalek am 19 Okt. 2013
Bearbeitet: Azzi Abdelmalek am 19 Okt. 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 Kommentare
Ved
Ved am 19 Okt. 2013
@Azzi: First two scripts worked perfectly.Thank you !
Ved
Ved am 19 Okt. 2013
@Azzi:
Could you please explain the line which is using cell2mat() in your first code.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Andrei Bobrov
Andrei Bobrov am 19 Okt. 2013
Bearbeitet: Andrei Bobrov am 20 Okt. 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 Kommentare
Ved
Ved am 20 Okt. 2013
Bearbeitet: Ved am 20 Okt. 2013
@Andrei:
Thank You ! but third one is giving an error:
Error using repmat
Too many input arguments.
nevertheless other two options works perfectly.
Andrei Bobrov
Andrei Bobrov am 20 Okt. 2013
corrected

Melden Sie sich an, um zu kommentieren.

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by