用具有不同范围的均匀分布的随机数填充多维矩阵
Posted
技术标签:
【中文标题】用具有不同范围的均匀分布的随机数填充多维矩阵【英文标题】:fill a mulit-dimentional matrix with uniformly distributed random numbers with diffierent ranges 【发布时间】:2017-04-07 04:22:01 【问题描述】:我想用均匀分布的随机数填充 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 循环
【问题讨论】:
【参考方案1】:你误解了RNG::fill()
的APIdocumentation,其中明确定义了参数a和b为:
a - 第一个分布参数;在均匀分布的情况下, 这是一个包容性的下界。
b - 第二个分布参数; 在均匀分布的情况下,这是一个不包含的上 边界。
因此文档中没有提到您可以在a
和b
中传递多个范围。所以解决方案是创建两个Mat
的1000 x 1
维度,为它们使用不同的a
和b
值,然后将它们连接起来以创建具有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);
【讨论】:
谢谢,但是文档中的这句话“在多通道图像的情况下,每个通道都是独立填充的......”这句话是什么意思?如果我们只允许用统一的相同范围值填充整个矩阵,那么 Scalar 的用途是什么【参考方案2】:只是我在使用带有多范围分布参数的 RNG::fill api 时犯了一个错误。应该使用多通道而不是多列矩阵,即使它们共享相同的底层数据结构。所以,Mat centers(10000, 2, CV_32F);
应该是 Mat centers(10000, 1, CV_32FC2);
【讨论】:
以上是关于用具有不同范围的均匀分布的随机数填充多维矩阵的主要内容,如果未能解决你的问题,请参考以下文章