2017-12-28 125 views
5

Bir Markov zinciri gibi bir şeyin simülasyonunu yapmaya çalışıyorum ve s_i - s_j durumunun değişimini simüle etmek için discrete_distribution'ı kullanıyorum. Ama tabi ki, bu bir Matrix, bir vektör değil. Ben de deniyorum."discrete_distribution" vektörünün ayarlanması C++

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

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

ancak bu çalışmaz.

not: uint16_t bir vektör

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

doğru olmadığını bildiğim bu answer

dayalı

// 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())); 

çalışır Sadece 1 vektörü çalışırsanız, bu edilir ancak, v1 'den v' 'ye kadar olan değişimin, farklı dağılımların

+0

"v1" ve benzeri adlandırılan bu atılan vektörleri oluşturmak yerine, neden iç içe geçmişini başlatılamıyor tek vuruşta ctor? – tadman

+1

Çünkü nasıl yapacağımı bilmiyordum. Ama şu anki cevap ile biliyorum. –

+0

Oldukça basit bir şey ve Vittorio bunu iyi açıklıyor. Bu soru esas olarak bununla ilgili mi, yoksa "discrete_distribution" bölümünde hala bir sorun mu var? – tadman

cevap

5

İç içe geçmiş vektörleri başlatmak için liste başlatmayı kullanabilirsiniz. Ör: Eğer dağılımların vektörleri boşaltılmış ne zaman

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

Liste başlatılmasının yine de geçici olarak oluşturulacağını unutmayın. Bkz. [Std :: initializer_list] maliyeti (https://akrzemi1.wordpress.com/2016/07/07/the-cost-of-stdinitializer_list/) – Thomas

2

Ben, bu şablonu

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())); 
    } 

} 

ve bu işlevle

kullanarak bu answer

gibi bunu yapmak için bir yol bulmak

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

Kodunuz 'std :: dönüşümü 'ile birlikte kullanabilir std :: back_inserter': https://godbolt.org/g/DcxeUv – Justin

+0

Sadece bir satır kullanmak mümkün mü? std :: discrete_distribution dist (v.begin(), v.end()); 'Biliyorum ... hepsinin sadece bir satır ve saçma bir şeyle olmasını istemek… Ama öğrenmek için saçma sorular sormam gerek. Rastgele mutasyonlarla genetik algoritma gibi. –

+1

Aslında, aslında bir out parametresi kullandığınız için, yalnızca [bir const olmayan başvuru almak yerine sonucu doğrudan döndürmeniz daha iyi olabilir] (https://godbolt.org/g/okm2fg) – Justin