2017-09-05 7 views
2

は、通常、私は(C++で)のようなものを使用することになり、配列の要素を介して複数回反復する、size_of_array < nと仮定すると:1D配列要素を複数回ループする方法は?

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/Octaveインデックスは、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から開始すると、これがどのように行われますか?インナーインデックスi % size_of_arrは、MATLABで[0 size_of_arr-1]

i範囲[1 size_of_arr]である範囲内にある場合

+2

そのための慣用形式は 'mod(i-1、n)+ 1'です(私はそれを_1ベースのモジュラス_と呼んでいます)。それで、おそらく 'elem = arr(mod(i-1、length(arr))+ 1);'あなたのために働きます(私はあなたが達成しようとしているものがわかりません) –

+2

'length'を決して使用しません。最長寸法の長さ。代わりに 'numel'(要素の数)を使用します。 – carandraug

+0

'error:arr(0):'ゼロはMatlabがあなたに叫んでいるものです。 – Yvon

答えて

5

C++では、あなたは、このように単に

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

に変更、

arr[ i % size_of_arr] 

を行うだろう最初のビット(mod(i-1, numel(arr)))は、インデックスが[0 size_of_arr-1]の内側にあることを確認します。あなたはそれに1を加えるだけです。

+1

ありがとうございました!したがって、インデックスをゼロ起点にオフセットし、モジュロ演算の結果を1から順に調整することです。 – Ziezi