用具有不同范围的均匀分布的随机数填充多维矩阵

时间:2017-04-07 04:22:01

标签: c++ opencv opencv3.0

我想用OpenCV(v3.2)中的10000x2矩阵填充均匀分布的随机数,但每列的范围不同,以下是代码的问题:

Mat centers(10000, 2, CV_32F);
RNG rng(time(NULL));
rng.fill(centers, RNG::UNIFORM, Scalar(0, 0), Scalar(10, 1000));

我希望第一列随机填充0到10之间的值,第二列填充0到1000之间的值。但是这两列都填充了0到10之间的值, 所以我决定以下面的形式实现它。

Mat centers(10000, 2, CV_32F);
RNG rng(time(NULL));
rng.fill(centers.colRange(0, 1), RNG::UNIFORM, 0, 10);
rng.fill(centers.colRange(1, 2), RNG::UNIFORM, 0, 1000);

但它也不起作用。我认为因为RNG :: fill不支持非连续矩阵(文档中没有提到) 所以唯一剩下的方法就是使用for循环,浪费时间和性能。我上面做错了还是应该放弃并使用for循环

2 个答案:

答案 0 :(得分:0)

您错误解释了RNG::fill()的API documentation,它明确将参数a和b定义为:

  

a - 第一个分布参数;在均匀分布的情况下,   这是一个包容性的下界。

     

b - 第二个分布参数;   在均匀分布的情况下,这是一个非包容性的鞋面   边界。

因此,文档中没有提及您可以在ab中传递多个范围。因此,解决方案是创建两个Mat 1000 x 1维度,对它们使用不同的ab值,然后将它们连接起来创建一个统一的垫子1000 x 2尺寸。

cv::RNG rng = cv::RNG(0xFFFFFFFF);
cv::Mat centers(10000, 1, CV_32F);
cv::Mat centers2(10000, 1, CV_32F);
rng.fill(centers, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(10));
rng.fill(centers2, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(1000));

cv::Mat final;
cv::hconcat(centers, centers2, final);

答案 1 :(得分:0)

使用具有多范围分布参数的RNG :: fill api时,我犯了一个错误。一个人应该使用多通道而不是多列矩阵,即使它们共享相同的底层数据结构。因此,Mat centers(10000, 2, CV_32F);应为Mat centers(10000, 1, CV_32FC2);