2017-12-28 82 views
5

Markov 체인 과 같은 시뮬레이션을 만들고 discrete_distribution을 사용하여 상태 s_i에서 s_j 로의 변경을 시뮬레이트하려고합니다. 물론 이것은 매트릭스가 아니라 벡터입니다. 그래서 해보겠습니다."discrete_distribution"의 벡터를 설정하는 방법

std::vector <uint16_t> v {{...}, 
          {...}, 
          ... 
          {...},}; 

std::vector <std::discrete_distribution <uint16_t> > distr(n, std::distribution <uint16_t> (v.begin(), v.end())); 

그러나 이것은 작동하지 않습니다.

참고 : uint16_t의 벡터

std::vector <std::discrete_distribution <uint16_t> > distr(n, std::distribution <uint16_t> (v.begin(), v.end())); 

가 올바르지 않은 것을 내가 알고있는이 answer

에 따라

// CHANGE v by v[0] 
std::vector<std::discrete_distribution <uint64_t>> distr(1, std::discrete_distribution <uint64_t> (vecs[0].begin(), vecs[0].end())); 

작동 난 그냥 1 개 벡터를하려고하면,이된다 ,하지만 나는 v1에서 v2로 변화에 대해 말할 수있다. 이산 분포의 벡터를 사용할 수 있음을 증명하기 위해서

+0

'v1'이라고 불리는이 던져 버리는 벡터를 만드는 대신에 중첩 된 ve를 초기화하지 않는 것이 어떻습니까? 한 번에 ctor? – tadman

+1

나는 그것을하는 방법을 몰랐기 때문에. 그러나 지금 아래의 답을 알고 있습니다. –

+0

아주 간단합니다. 비토리오가 잘 설명해줍니다. 이 질문은 주로 그것에 관한 것입니까, 아니면'discrete_distribution' 부분에 여전히 문제가 있습니까? – tadman

답변

5

목록 초기화을 사용하여 중첩 된 벡터를 초기화 할 수 있습니다. 예 : 당신이 분포의 벡터를 비울 때

std::vector<std::vector<int>> v{ 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {7, 8, 9} 
}; 
+0

목록 초기화가 여전히 임시 파일을 생성한다는 점에 유의하십시오. [std :: initializer_list의 비용] (https://akrzemi1.wordpress.com/2016/07/07/the-cost-of-stdinitializer_list/)을 참조하십시오. – Thomas

2

나는이 템플릿

template<typename T> 
void set_distributions(std::vector< std::discrete_distribution <T> > &distr, const std::vector< std::vector<T> > &vecs){ 
    for (uint64_t i = 0; i < vecs.size(); ++i) { 
    distr.push_back(std::discrete_distribution <uint64_t> (vecs[i].begin(), vecs[i].end())); 
    } 

} 

이 기능

를 사용하여이 answer

에서처럼 할 수있는 방법을 찾을

std::vector<std::discrete_distribution <uint64_t>> distr; 
    set_distributions(distr, vecs); 
+1

코드는'std :: transform'과 함께' std :: back_inserter' : https://godbolt.org/g/DcxeUv – Justin

+0

한 줄만 사용해도됩니까? 'std :: discrete_distribution dist (v.begin(), v.end())와 같이; '나는 하나의 선과 그 어리석은 말로 모두를 원한다는 것을 알고있다. 그러나 나는 배우기에 어리석은 질문을해야한다. 무작위 돌연변이가있는 유전자 알고리즘과 비슷합니다. –

+1

사실 기본적으로 out 매개 변수를 사용하기 때문에 비 const 참조가 아닌 결과를 직접 반환하는 것이 좋습니다. (https://godbolt.org/g/okm2fg) – Justin