2016-12-05 85 views
2

我想創建一個由我設置的比例的隨機1和0的向量(在我稱之爲丟失的程序中)向量的大小與之前相同創建矢量CSUM。用1和0創建一個隨機的std :: vector C++

在MATLAB

這將是

dropout=0.9; 
n_elements=size(CSUM) 
drpoutmask = (rand(n_elements) > dropout); 
用C++

size_t elements = Csum.size(); 
std::vector<float> y(elements); 
std::uniform_real_distribution<float> distribution(0.0f, 1.0f); 
std::mt19937 engine; // Mersenne twister MT19937 
auto generator = std::bind(distribution, engine); 
std::generate_n(y.begin(), elements, generator); 
std::vector<int> dropoutmask(elements,0); 
float dropout=0.9; 

for(int i=0; i<elements; i++) 
    { 
    if(y.at(i)>dropout) 
    { 
    dropoutmask.at(i)=1; 
    } 
    } 
} 

其作品,但對於巨大的載體是非常非常慢,有沒有更快的方式做到這一點?我在C++上很新。

任何幫助將非常感激

+0

在MATLAB我的意思是說N_元件=長度(CSUM)不N_元件=大小(CSUM) –

+0

考慮'的std :: bitset'爲'dropoutmask'如果是隻是一個標誌 –

+0

愚蠢的問題,你編譯優化打開? – Borgleader

回答

5
  1. 你知道bernoulli distribution,對不對?您可以使用它來直接生成整數向量。
    實施例:

    #include <iostream> 
    #include <algorithm> 
    #include <string> 
    #include <random> 
    
    int main() 
    { 
        constexpr double dropout = 0.9; // Chance of 0 
        constexpr size_t size = 1000; 
        std::random_device rd; 
        std::mt19937 gen(rd()); 
        std::bernoulli_distribution dist(1 - dropout); // bernoulli_distribution takes chance of true n constructor 
    
        std::vector<int> dropoutmask(size); 
        std::generate(dropoutmask.begin(), dropoutmask.end(), [&]{ return dist(gen); }); 
        size_t ones = std::count(dropoutmask.begin(), dropoutmask.end(), 1); 
        std::cout << "vector contains " << ones << " 1's, out of " << size << ". " << ones/double(size) << "%\n"; 
        std::cout << "vector contains " << size - ones << " 0's, out of " << size << ". " << (size - ones)/double(size) << "%\n"; 
    } 
    

    直播例如:http://coliru.stacked-crooked.com/a/a160743185ded5c5

  2. 替代地,可以創建具有希望尺寸的整數向量(這將設置爲0的所有元素),設置前N個元素爲1,其中,n是(1 - dropout) * size(你說你想要一個比例,而不是隨機數量接近比例),然後洗牌矢量。

    #include <iostream> 
    #include <algorithm> 
    #include <string> 
    #include <random> 
    
    int main() 
    { 
        constexpr double dropout = 0.9; // Chance of 0 
        constexpr size_t size = 77; 
        std::random_device rd; 
        std::mt19937 gen(rd()); 
    
        std::vector<int> dropoutmask(size); 
        std::fill_n(dropoutmask.begin(), dropoutmask.size() * (1 - dropout), 1); 
        std::shuffle(dropoutmask.begin(), dropoutmask.end(), gen); 
    
        size_t ones = std::count(dropoutmask.begin(), dropoutmask.end(), 1); 
        std::cout << "vector contains " << ones << " 1's, out of " << size << ". " << ones/double(size) << "%\n"; 
        std::cout << "vector contains " << size - ones << " 0's, out of " << size << ". " << (size - ones)/double(size) << "%\n"; 
    
        for (auto i :dropoutmask) { 
         std::cout << i << ' '; 
        } 
        std::cout << '\n'; 
    } 
    

活生生的例子:http://coliru.stacked-crooked.com/a/0a9dacd7629e1605

+0

不錯的發現。但也許你可以提供一些代碼,而不是第一部分的「僅鏈接」答案。 –

+0

@ Jean-FrançoisFabre完成。 –

+0

現在這是一個相當不錯的答案! –