how rearrange data in a matrix?

1 visualización (últimos 30 días)
Ved
Ved el 19 de Oct. de 2013
Comentada: Andrei Bobrov el 20 de Oct. de 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?

Respuesta aceptada

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

Iniciar sesión para comentar.

Más respuestas (1)

Andrei Bobrov
Andrei Bobrov el 19 de Oct. de 2013
Editada: Andrei Bobrov el 20 de Oct. de 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 comentarios
Ved
Ved el 20 de Oct. de 2013
Editada: Ved el 20 de Oct. de 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 el 20 de Oct. de 2013
corrected

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by