Maxtrix copy and manipulation

1 visualización (últimos 30 días)
Fischer Zheng
Fischer Zheng el 17 de Sept. de 2015
Editada: Matt J el 18 de Sept. de 2015
I have one matrix and one vector. I would like to shift the elements of row forward depending on the vector index.
M = [0 2 4 5;
0 4 7 9;
0 0 0 34];
v = [4 3 2];
Shift the elements of M forward, v(1) = 4 indicate start result with the 4th element of the row. Pad the end of row with zeros.
Result = [5 0 0 0;
7 9 0 0;
0 0 34 0]
How do I do this in the vectorized way?
Thanks, Fischer

Respuesta aceptada

Star Strider
Star Strider el 17 de Sept. de 2015
This uses a loop, but I can’t see how to do this without one:
M = [0 2 4 5; 0 4 7 9; 0 0 0 34];
v = [4 3 2];
c = size(M,2);
Result = zeros(size(M));
for k1 = 1:size(M,1)
Result(k1,1:c-v(k1)+1) = M(k1,v(k1):c);
end
  5 comentarios
Fischer Zheng
Fischer Zheng el 17 de Sept. de 2015
You are right, too bad.
Star Strider
Star Strider el 17 de Sept. de 2015
Thank you.
If you’re doing this once for each large matrix, save the shifted matrix to a .mat file. Then you can simply load the shifted matrix when you need it, rather than recalculating it each time.

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 17 de Sept. de 2015
Editada: Matt J el 18 de Sept. de 2015
v=v(:);
[m,n]=size(M);
[I,J,S]=find(M);
J=J-v(I)+1;
idx=J>0;
Result=sparse(I(idx),J(idx),S(idx),m,n);
Result=full(Result); %optional
  1 comentario
Fischer Zheng
Fischer Zheng el 17 de Sept. de 2015
Editada: Fischer Zheng el 17 de Sept. de 2015
Thanks for the update. Let me take a look again.
Thanks,

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by