Circular indexing of an array

23 ビュー (過去 30 日間)
Wade
Wade 2012 年 7 月 31 日
編集済み: amir moin 2021 年 7 月 23 日
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!

採用された回答

Walter Roberson
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
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
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
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

Teja Muppirala
Teja Muppirala 2012 年 8 月 1 日
X = 1:10;
ifft(fft(X).*fft([1 1]/2,numel(X)))

bym
bym 2012 年 7 月 31 日
編集済み: bym 2012 年 7 月 31 日
I don't know if it will help but you can use X as the index variable in the loop
X = [10 1:10]
for X
...
end
alternatively, if inside the loop is what you posted you can do
y = conv(X,[.5 .5]);
y([1 end]) = [];
without a loop

Andrei Bobrov
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');

Wade
Wade 2012 年 8 月 2 日
Thanks all!

amir moin
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
amir moin 2021 年 7 月 23 日
Sorry! I had made a mistake. Now the corrected solution is there. Thank you for your comment.
Walter Roberson
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 ExchangeLoops and Conditional Statements についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by