2013-08-03 2 views
0

해결할 40 개 이상의 ODE가있는 시스템이 있는데, 일반적으로 인텔 ODE와 같은 라이브러리에서 수행 할 수 있습니다. 이 문제의 본질 때문에이 라이브러리는 매개 변수로만 배열을 사용합니다. 이런 식으로 나는 ODEs의 모든 상태를 하나의 배열, 예를 들어 Y [0], ..., Y [39]에 넣어야합니다. 분명히 그렇듯이 전체 프로그램을 읽고 쓰는 것이 고통 스럽습니다. 매번 Y [i]가 나타내는 것을 확인해야합니다!c/C++의 배열 요소에 대한 별칭

따라서 이러한 배열에 별칭을 사용하는 좋은 방법이 있습니까? 또한, 모든 시스템을 클래스에 넣는 것에 대해 생각하고 있는데, 배열 요소에 대한 참조를 사용하는 것을 더 어렵게 만듭니다.

+0

그래서 ODE는 배열로 떨어 뜨리기 전에 어디에 있나요? 현재 배열을 저장하는 대신 배열 (또는 std :: vector <>)을 기본 저장소로 사용하는 것이 더 합리적일까요? – WhozCraig

+0

답장을 보내 주셔서 감사합니다. 현재는 방정식에서 직접 나온 이중 변수로 저장됩니다. Vm = exp (-dt/τ); 활성화 = inf - 활성화 * (exp (-dt/τ)); (예를 들면); – 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]; }};'. 메모리 오버 헤드가 없으며 모든 함수 호출은 최적화 된 빌드에서 인라인 될 가능성이 높기 때문에 성능 오버 헤드도 발생하지 않습니다. –