我有一個系統需要40多個ODE來解決,通常可以使用像intel ODE這樣的庫來完成。由於這個問題的性質,這些庫僅將數組作爲參數。這樣我必須將ODE的所有狀態放入一個數組中,比如Y [0],...,Y [39]。很明顯,這使得整個程序很難讀寫。我必須檢查每次Y [i]表示的內容!c/C++中數組元素的別名
那麼,有沒有什麼好的方法來使用這些數組的別名?另外,我正在考慮將所有系統放入一個類中,這使得使用對數組元素的引用更加困難。
我有一個系統需要40多個ODE來解決,通常可以使用像intel ODE這樣的庫來完成。由於這個問題的性質,這些庫僅將數組作爲參數。這樣我必須將ODE的所有狀態放入一個數組中,比如Y [0],...,Y [39]。很明顯,這使得整個程序很難讀寫。我必須檢查每次Y [i]表示的內容!c/C++中數組元素的別名
那麼,有沒有什麼好的方法來使用這些數組的別名?另外,我正在考慮將所有系統放入一個類中,這使得使用對數組元素的引用更加困難。
你可以使用索引的一個枚舉到Y:
enum Quantities {
kDistance,
kVelocity,
kAcceleration,
...
};
現在你可以代替Y[0]
到處寫Y[kDistance]
。
或者,你可以定義每個數組元素命名爲引用:
double Y[40];
double& Distance = Y[0];
double& Velocity = Y[1];
...
現在你可以代替Y[0]
到處寫Distance
。
謝謝。我曾考慮過使用對數組中各個元素的引用。這是否需要更多的內存?我想把所有的狀態變量放到一個類中。如果使用引用,我不知道如何執行此操作,即如何爲類中的成員變量定義引用。 – Qiangzini
「這是否需要更多內存?」大概。我希望編譯器在內部將引用表示爲指針。這是可能的,在一個優化的構建中,這些引用將被優化掉並替換爲數組元素訪問,但我對此表示懷疑。如果真的讓你困擾,你可以使用宏,如'#define Distance(Y [0])'。就個人而言,我不擔心40個指針的內存開銷,除非你在*真正*資源受限的設備上工作。 –
在一個類中,更好的方法可能是一個存取方法:class C {double Y [40]; public:double&Distance(){return Y [0]; }};'。這沒有任何內存開銷,並且所有函數調用都很可能在優化構建中內聯,因此它也不會有任何性能開銷。 –
那麼...... ODE *在放入陣列之前在哪裏?簡單地使用數組(或std :: vector <>)作爲主存儲器而不是當前存儲它們的位置會更有意義嗎? – WhozCraig
謝謝你的回覆。目前它們只是作爲雙變量存儲,直接來自方程式。像Vm = exp(-dt/tau); activation = inf - activation *(exp(-tt/tau)); (舉個例子); – Qiangzini