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

标签 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 循环

最佳答案

您误解了 API documentation RNG::fill(),它清楚地将参数 a 和 b 定义为:

a - first distribution parameter; in case of the uniform distribution, this is an inclusive lower boundary.

b - second distribution parameter; in case of the uniform distribution, this is a non-inclusive upper boundary.

因此文档中没有提到您可以在ab 中传递多个范围。所以解决方案是创建两个 1000 x 1 尺寸的 Mat,使用不同的 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);

关于c++ - 用具有不同范围的均匀分布的随机数填充多维矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43269592/

相关文章:

c++ - 如何从 HWND 句柄获取可读的类名和标题?在 WinApi C++ 中

java - 使用 Spring boot 加载 keras 模型

Python OpenCV - 一个模板匹配函数

c++ - 如何在自己的函数中最好地处理 Mat 中的不同数字格式

python-3.x - 发送OpenCV图像并使用base64解码 : why not compatible?

c++ - 如何将图像缓冲区传递给 OpenCV Mat 对象?

c++ - Boost MSM 开启当前状态

c++ - 在 Linux 中使用命名管道的简单客户端/服务器程序

c++ - 通过引用 vector 给出错误的结果

python - 如何对使用 SimpleITK 读取的 DICOM 图像进行直方图均衡化