Maxtrix copy and manipulation

1 次查看(过去 30 天)
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

采纳的回答

Star Strider
Star Strider 2015-9-17
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 个评论
Star Strider
Star Strider 2015-9-17
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.

请先登录,再进行评论。

更多回答(1 个)

Matt J
Matt J 2015-9-17
编辑:Matt J 2015-9-18
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 个评论
Fischer Zheng
Fischer Zheng 2015-9-17
编辑:Fischer Zheng 2015-9-17
Thanks for the update. Let me take a look again.
Thanks,

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by