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

1 Stimme

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

1 Stimme

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.

Kategorien

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by