How do you circshift progressive rows an increasing amount?

If I have a matrix:
[nan nan nan nan nan]
[ 1a nan nan nan nan]
[ 1b 2b nan nan nan]
[ 1c 2c 3c nan nan]
[ 1d 2d 3d 4d nan]
I want to change it to this:
[ 1a 2b 3c 4d nan]
[ 1b 2c 3d nan nan]
[ 1c 2d nan nan nan]
[ 1d nan nan nan nan]
[nan nan nan nan nan]
I tried:
for K = 1:length(A)
A = circshift(A(:,K),K);
Thank you.

4 个评论

I got this to work:
done = []
for M = 1:5
stemp = circshift(A(:,M),-M,1);
done = [done stemp];
end
------------
Originally I didn't have semicolons. Oops.
Yes, that is indeed very slow. See my answer for a faster solution.
It was going slow because of missing semicolons. Oops. I'm not sure how to turn your solution in to code to try. If you would like to provide a sample I will try it out. The code I made does the 400x400 matrix in about a second for reference.
I have edited my answer to include the edit I meant. Dynamically growing an array is a bad idea, as mlint is warning you. You should make it a habit of resolving every mlint warning. Either suppress them (right-click and select suppress warning on this line), or change the code.

请先登录,再进行评论。

 采纳的回答

You need to index a column in A in your output as well.
for K = 1:size(A,2)
A(:,K) = circshift(A(:,K),K);
end
If you want to move every NaN to the bottom, you can also use the sort function.

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Logical 的更多信息

产品

版本

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by