【发布时间】:2014-03-12 14:55:41
【问题描述】:
我想生成一个随机矩阵,它的元素应该只有 1 或 0,我必须通过很多限制,例如:
- 0 的数量等于 1 的数量或 70% 0 30% 1
- 大多数 0 在矩阵的角落或中心部分
- 0 避免常见的图案,如对角线或矩形
目的是提供像棋盘一样的图形表示,必须随机生成许多矩阵并显示给用户。
因此,我使用了来自 opencv2 的 cv::Mat,这正是我对图形表示所需要的,但它对随机限制感到不舒服;我的代码:
Mat mean = Mat::zeros(1,1,CV_32FC1);
Mat sigma= Mat::ones(1,1,CV_32FC1);
Mat resized = Mat(300,300,CV_32FC3);
Mat thr;
lotAreaMat = Mat(lotAreaWidth,lotAreaHeight,CV_32FC3);
randn(lotAreaMat, mean, sigma);
resize(lotAreaMat, resized, resized.size(), 0, 0, cv::INTER_NEAREST);
Mat grey;// = resized.clone();
cvtColor(resized,grey,CV_RGB2GRAY);
threshold(grey,thr,0.2,255,THRESH_BINARY_INV);
这里的问题是我不知道如何定义随机生成器模式,一些想法?
这些矩阵的图形表示看起来像 AR 标记!
【问题讨论】:
-
你想要0和1的随机分布,还是限制?您的 x% 和 100-x% 1s 和 0s 非常简单:使用
randu而不是randn值从 0 到 100,然后将所有值 -
使用限制的一种方法是这样做:创建一个具有 70% 30% 分布的随机矩阵。然后调用一个测试你的限制的方法:计算对角线元素,计算中心和/或角落的 0。如果矩阵通过了您的测试,请接受它。否则:创建另一个随机矩阵并对其进行测试。
-
我会尝试用所需比例的 1 和 0 填充一个数组,然后将它们随机排列以维持或建立您的限制标准。