创建一个随机的std ::向量,其中一个和零C
Creating a random std::vector with ones and zeros C++
我想以我设置的比例创建一个随机1和0的向量(在程序中,我称之为辍学),向量与以前创建的向量csum相同。
在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 。
任何帮助都将不胜感激
-
您确实知道Bernoulli发行版,对吗?您可以使用它直接生成整数向量。
示例:#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
-
另外,您可以创建一个所需尺寸的整数向量(将所有元素设置为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
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将 std::array 移动到另一个 std::array
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 使用 glDrawElements 绘制一个 std::vector
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 如何有效地将(一些)项目从一个std::map移动到另一个std::map
- 我可以制作一个std::set的constexpr对象吗
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- Visual Studio 2017 STL 可视化工具失败了一个 std::map<MyIntrusivePtr, std::tuple<....> >
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 如何声明一个 std::用不同值内联初始化的结构数组
- 将对象从一个 std::d eque 移动到另一个的更好方法