2017-09-05 81 views
2

假設size_of_array < n,通過數組元素迭代多次,通常我會使用類似(在C++):如何多次循環一維數組元素?

for (size_t i = 0; i < n; ++i) 
{ 
    elem = arr[ i % size_of_arr ]; 
} 

如果arr = {1, 2, 3};,對於elem我會得到:

1 2 3 1 2 3 ... 

然而,在MATLAB /倍頻程索引從1開始:

for i = 1 : n 

    elem = arr(mod(i, length(arr) + 1)); 
end 

所以當n == length(arr)我得到一個錯誤:

error: arr(0): subscripts must be either integers 1 to (2^31)-1 or logicals

這是如何做到當指數從1開始?

+2

這種習慣形式是'mod(i-1,n)+ 1'(我稱之爲基於_1的modulus_)。所以,也許'elem = arr(mod(i-1,length(arr))+ 1);'對你有用(我不確定你想要達到什麼效果) –

+2

永遠不會使用'length',它會返回最長維度的長度。相反,使用'numel'(元素數量)。 – carandraug

+0

'錯誤:arr(0):'零是Matlab試圖對你大喊大叫。 – Yvon

回答

5

在C++中,你會做

arr[ i % size_of_arr] 

其中內部指標i % size_of_arr在範圍內[0 size_of_arr-1]

在MATLAB,i在範圍內[1 size_of_arr],從而也就改變

mod(i-1, numel(arr)) + 1 

的第一位(mod(i-1, numel(arr)))確保索引位於[0 size_of_arr-1]之內, d你只需要添加1即可。

+1

謝謝!所以,我們所做的是將索引抵消到零原點,並將模運算的結果從1開始調整,對吧? – Ziezi