2013-10-02 2 views
1

필자는 각 측정 값에 두 개의 불확실성 (예 : + up/- down)이있는 일련의 측정 (float 벡터)을 다루고 있습니다. 쌍의 벡터 또는 한 쌍의 벡터?

Loop over the vector of the measurements 
{ 
    cout << i-th central value << " +" << i-th up uncertainty << "/-" << i-th down uncertainty << end; 
} 

을 할 수있는 가장 효율적인/우아한 방법은 무엇입니까

같은,이 전 화면이 값을 덤프하고 싶은 말은하자?

vector<float> central; //central measurement 
vector<pair<float,float>> errors; //errors 
for(int i = 0; i < central.size ; i++) 
{ 
    cout << central.at(i) << " +" << errors.at(i).first << "/-" << errors.at(i).second << endl; 
} 

3) 두 개의 별도의 벡터 :

vector<float> central; //central measurement 
vector<float> errUp; //errors up 
vector<float> errDown; //errors down 
for(int i = 0; i < central.size ; i++) 
{ 
    cout << central.at(i) << " +" << errUp.at(i) << "/-" << errDown.at(i) << endl; 
} 
+1

3 개의 데이터가 모두 포함 된 'struct'를 만듭니다. – andre

답변

6

이 :

각 요소 나에게

말씀이 관련된 불확실성 (말 + 위/-down)을 가지고있는

당신이 당신의 세 가지 요소를 포함하는 객체가 (값 + 위/아래). 따라서, 나는 그 객체를 생성하고 그것을 단일 벡터에 저장한다.

여러 벡터를 사용하여 저장한다는 것은 트랜잭션을 동기화하여 유지해야한다는 것을 의미합니다. 그렇게하는 것이 가장 번거롭기 때문에 안전을 위해 벡터를 캡슐화해야합니다.

+0

당신의 제안 (Kerrek의 것뿐만 아니라)은 이상적 일 것입니다. 문제는 "중앙"이며 불확실성은 코드의 다른 부분에서 평가됩니다. 모든 작업을 수행하여 "중앙" 벡터 및 불확실성을 평가하는 또 다른 클래스 "SystematicUncertainties"가 있습니다. 특히, 나는 현재 SystematicUncertainties 클래스를 설계하고 있으며, ~ 50 가지의 다른 불확실성 소스 (즉, ~ 50 잠재적 "업 - 다운"벡터)가있을 것이므로 가능한 한 효율적으로 구현하려고합니다. – Blackphoenix

2

방법 벡터에 대한 쌍의 벡터를 이용하여 벡터

vector<float> central; //central measurement 
pair<vector<float>, vector<float>> errors; //errors 
for(int i = 0; i < central.size ; i++) 
{ 
    cout << central.at(i) << " +" << errors.first.at(i) << "/-" << errors.second.at(i) << endl; 
} 

2

)의 쌍을 사용

1) 트리플 중?

#include <array> 
#include <vector> 

using Measurement = std::array<float, 3>; 

std::vector<Measurement> data; 
1

나는 단일 책임에 대한 측정이라고하는 클래스 나 구조체를 만들 것입니다. 불확실성에 대한 두 가지 값이 필요하지 않을 수도 있습니다. 대부분의 경우 이들은 부호에 관계없이 동일합니다. 즉, 하나의 불확실성 값이 정상적으로 처리 될 수 있습니다.

struct Measurement 
{ 
    union 
    { 
    float values[3]; 
    struct { float value, uncertaintyUp, uncertaintyDown; }; 
    }; 
} 

유니온을 사용하면 원하는 가독성과 [] 연산자의 유연성을 얻을 수 있습니다.

main() 
{ 
    Measurement x; 
    x.value = 1.0f; 
    x.uncertaintyUp = 0.1f; 
    x.uncertaintyDown = -0.1f; 

    for(int i = 0; i < 3; i++) 
    { 
    cout << x.values[i] << " "; 
    } 
} 

여기에서 Measurement 구조체의 벡터를 사용하는 것이 간단합니다. 데이터 용으로 하나의 컨테이너를 사용할 수 있다면 항상 최선입니다. 생각해 보면 세 벡터의 모든 데이터가 항상 개수와 용량면에서 동일하므로 여분의 오버 헤드가 필요하지 않습니다. 하나의 벡터는 시공간을 절약합니다.

+1

단일 책임 원칙. 특정 직업에 대한 특정 클래스를 만드는 것이 핵심입니다. +1 –

관련 문제