Circular indexing of an array
77 次查看(过去 30 天)
显示 更早的评论
I have run into this a number of times in a recent project I'm working on and was wondering what good solutions are out there. What happens is I often have an array representing positions on a line.
X = 1:10;
I want to create a function that indexes the code and circularly wraps around such that when I go through the first iteration of my loop idx-1 = 0 is interpreted as a 10 instead.
for i = 1:10
(X(i-1)+X(i))/2
end
I've tried appending the end element of the array on to the beginning.
X = [10 1:10]
for i = 2:11
...
Seems kind of like an ugly solution though. Any other suggestions?
Thanks!
0 个评论
采纳的回答
Walter Roberson
2012-7-31
编辑:Walter Roberson
2012-7-31
wrapN = @(x, N) (1 + mod(x-1, n));
N = length(X);
for i = 1:10
(X(wrapN(i-1,N))+X(wrapN(i,N)))/2
end
2 个评论
Abhinav Gupta
2017-4-30
Just a minor typo in the wrapN function. It should be:
wrapN = @(x, n) (1 + mod(x-1, n));
Walter Roberson
2017-4-30
Ah, right. Or to be consistent with my naming,
wrapN = @(x, N) (1 + mod(x-1, N));
更多回答(6 个)
Oleg Komarov
2012-7-31
I have something different, a vectorized approach:
X = 1:10;
shift = 1;
B1 = (circshift(X,[1 shift]) + X)/2
B2 = (X([end-shift+1 1:end-shift]) + X)/2 %equivalent
isequal(B1,B2) % 1
0 个评论
Andrei Bobrov
2012-8-1
编辑:Andrei Bobrov
2012-8-1
in this case
X = 1:10;
conv(X([end,1:end]),[1 1]/2,'valid');
0 个评论
amir moin
2021-7-23
编辑:amir moin
2021-7-23
Taking you need a circle of length N=10; then you can set the array X(100) to the value of circular index Index(k)
N=10;
Index = @(i) mod(i,N)+(mod(i,N)==0).*N;
X = Index(1:100);
end
3 个评论
amir moin
2021-7-23
Sorry! I had made a mistake. Now the corrected solution is there. Thank you for your comment.
Walter Roberson
2021-7-23
Seems complicated compared to my
wrapN = @(x, N) (1 + mod(x-1, N));
X = wrapN(1:100, 10);
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!