2013-08-03 154 views
0

我有一個系統需要40多個ODE來解決,通常可以使用像intel ODE這樣的庫來完成。由於這個問題的性質,這些庫僅將數組作爲參數。這樣我必須將ODE的所有狀態放入一個數組中,比如Y [0],...,Y [39]。很明顯,這使得整個程序很難讀寫。我必須檢查每次Y [i]表示的內容!c/C++中數組元素的別名

那麼,有沒有什麼好的方法來使用這些數組的別名?另外,我正在考慮將所有系統放入一個類中,這使得使用對數組元素的引用更加困難。

+0

那麼...... ODE *在放入陣列之前在哪裏?簡單地使用數組(或std :: vector <>)作爲主存儲器而不是當前存儲它們的位置會更有意義嗎? – WhozCraig

+0

謝謝你的回覆。目前它們只是作爲雙變量存儲,直接來自方程式。像Vm = exp(-dt/tau); activation = inf - activation *(exp(-tt/tau)); (舉個例子); – Qiangzini

回答

2

你可以使用索引的一個枚舉到Y:

enum Quantities { 
    kDistance, 
    kVelocity, 
    kAcceleration, 
    ... 
}; 

現在你可以代替Y[0]到處寫Y[kDistance]

或者,你可以定義每個數組元素命名爲引用:

double Y[40]; 
double& Distance = Y[0]; 
double& Velocity = Y[1]; 
... 

現在你可以代替Y[0]到處寫Distance

+0

謝謝。我曾考慮過使用對數組中各個元素的引用。這是否需要更多的內存?我想把所有的狀態變量放到一個類中。如果使用引用,我不知道如何執行此操作,即如何爲類中的成員變量定義引用。 – Qiangzini

+0

「這是否需要更多內存?」大概。我希望編譯器在內部將引用表示爲指針。這是可能的,在一個優化的構建中,這些引用將被優化掉並替換爲數組元素訪問,但我對此表示懷疑。如果真的讓你困擾,你可以使用宏,如'#define Distance(Y [0])'。就個人而言,我不擔心40個指針的內存開銷,除非你在*真正*資源受限的設備上工作。 –

+0

在一個類中,更好的方法可能是一個存取方法:class C {double Y [40]; public:double&Distance(){return Y [0]; }};'。這沒有任何內存開銷,並且所有函數調用都很可能在優化構建中內聯,因此它也不會有任何性能開銷。 –