C++ 构造0-1随机矩阵

这篇具有很好参考价值的文章主要介绍了C++ 构造0-1随机矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 数组表示

沿用传统C语言的构造方法,使用双重for循环。

#include <iostream>
#include <ctime>

const int M = 5; //矩阵行数
const int N = 5; //矩阵列数

void getRand(int mat[][N], int row);
int main()
{
	int mat[M][N];
    getRand(mat, M);
    return 0;
}
void getRand(int mat[][N], int row)
{
    srand(time(NULL));
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < N;++j)
        {
            mat[i][j] = rand()%2;
            std::cout << mat[i][j]<<"\t";
        }
        std::cout<<std::endl;
    }
}

输出结果:

0       0       0       1       1
0       1       0       1       0
0       1       1       1       0
0       1       1       1       0
1       0       1       0       0
  • srand()用于初始化随机数发生器,包含于<stdlib.h>头文件,用于设置rand()的随机数种子seed,原型为void srand(unsigned seed)
  • rand()是随机数发生器,包含于<stdlib.h>头文件,可根据当前的seed返回均匀分布的介于 0 和 RAND_ MAX 之间的伪随机整数,其中 RAND_ MAX<stdlib.h>头文件中的一个宏。
  • time()通常用于随机,需要#include <ctime>,大多数情况传入参数NULL,返回类型为time_t,返回值是从1970年1月1日至今所经历的时间(以秒为单位)。
  • 三者综合使用。一般使用时间戳作为种子,采用系统时间来初始化随机数发生器。具体来说,先通过srand(time(NULL)),该语句调用time(NULL)返回一个time_t类型,并转换为unsigned类型后传入srand(),完成初始化随机数种子的工作,然后在下面需要使用随机数的地方调用rand()即可。(rand()%n常用于生成[0, n-1]的随机整数)
  • 另外,getRand()函数将指针int mat[][N]作为参数,这里牵扯到“编写将二维数组作为参数的函数”的相关知识,容易出错。而且该函数只能处理列数固定的二维数组,只能修改传入的行数参数row,函数的可扩展性较差。

2. Eigen表示

下面提供两种方法,均使用Eigen::MatrixXd::Random()构造随机矩阵,再经过处理得到0-1矩阵。
第一种方法:getRandWithEigen()函数,用双for循环+条件运算符?:化为0-1矩阵。
第二种方法:getRandWithEigen_another()函数,使用.unaryExpr()方法和Lambda表达式化为0-1矩阵。

#include <iostream>
#include <eigen3/Eigen/Core>

const int M = 5;
const int N = 5;

Eigen::MatrixXd getRandWithEigen(int row, int col);
Eigen::MatrixXd getRandWithEigen_another(int row, int col);

int main()
{
    Eigen::MatrixXd test1 = getRandWithEigen(M, N);
    std::cout <<"Use two 'for', matrix is:\n" << test1 << std::endl;
    Eigen::MatrixXd test2 = getRandWithEigen_another(M, N);
    std::cout <<"Use \".unaryExpr()\" method, matrix is:\n" << test2 << std::endl;
    return 0;
}

Eigen::MatrixXd getRandWithEigen(int row, int col)
{
	srand(time(NULL));
    Eigen::MatrixXd mat = Eigen::MatrixXd::Random(M, N);
    for(int i = 0; i < M;++i)
    {
        for (int j = 0; j < N;++j)
        {
            mat(i, j) > 0 ? mat(i, j) = 1 : mat(i, j) = 0;
        }
    }
    return mat;
}

Eigen::MatrixXd getRandWithEigen_another(int row, int col)
{
	srand(time(NULL));
    Eigen::MatrixXd mat = Eigen::MatrixXd::Random(M, N).unaryExpr([] (double x)->double { return x > 0 ? 1 : 0; });
    return mat;
}

输出结果:

Use two 'for', matrix is:
0 1 0 0 1
1 1 1 0 0
1 1 1 1 1
1 0 1 1 0
0 1 0 0 1
Use ".unaryExpr()" method, matrix is:
0 1 0 0 1
1 1 1 0 0
1 1 1 1 1
1 0 1 1 0
0 1 0 0 1

使用Eigen库如下有几个优点:

  • 函数可扩展性提升。getRandWithEigen(int row, int col)函数通过调用Eigen::MatrixXd::Random(),可以处理任意行列数的二维数组。
  • 函数简洁性提升。如果使用的.unaryExpr()方法并结合Lambda表达式,可以用一行代码解决生成0-1随机矩阵的需求,所以还是要多学c++11的新特性啊!

参考文献

rand函数和srand函数详解
C/C++中关于时间的函数 time()
C++随机数产生以及通过Eigen库获得正态分布的随机矩阵
Eigen: Quick reference guide (这里有.unaryExpr()方法的详细说明)文章来源地址https://www.toymoban.com/news/detail-741612.html

到了这里,关于C++ 构造0-1随机矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++构造无向图,邻接矩阵,深度优先遍历,广度优先遍历

    目录 定义无向图邻接矩阵 构造无向图 打印邻接矩阵 无向图邻接矩阵深度优先遍历(DFS) 无向图邻接矩阵广度优先遍历(BFS) 测试  完整代码 定义无向图邻接矩阵 构造无向图 1、输入总顶点数和总边数 2、依次输入顶点信息存入顶点表 3、 初始化邻接矩阵,使每个权值初始化

    2024年02月06日
    浏览(82)
  • [C++] opencv中如何生成随机颜色?

    我们可以通过C++来生成OpenCV绘图使用的随机颜色,代码如下: 这个代码将生成一个大小为100x100像素的随机颜色图像。它首先使用当前时间作为随机数种子来初始化随机数生成器。然后,它使用 rand() 函数生成三个介于0到255之间的随机整数,分别表示红色、绿色和蓝色通道的

    2024年01月19日
    浏览(37)
  • 使用QT C++编写一个随机生成网络ip地址的程序

    根据网络搜索结果¹²³,使用QT C++编写一个随机生成网络ip地址的程序的示例代码可能如下: ```cpp #include QCoreApplication #include QRandomGenerator #include QDebug int main(int argc, char *argv[]) {     QCoreApplication a(argc, argv);     // 使用QRandomGenerator类来生成随机数     QRandomGenerator *generator =

    2023年04月08日
    浏览(74)
  • C++随机数生成:std标准库和Qt自带方法

    std::rand() 是C++中的一个随机数函数,它生成一个范围在0到 RAND_MAX 之间的伪随机整数。 在每次程序运行时,通常需要使用不同的种子值来初始化随机数生成器。可以使用 std::srand() 函数来设置种子值。 设置种子的目的是为了引入随机性,使得每次程序运行时生成不同的随机数

    2024年01月16日
    浏览(59)
  • Opencv C++图像处理:矩阵Mat + 随机数RNG + 计算耗时 + 鼠标事件

    数据类型 字节数 取值范围 bool型(布尔型) 1 [0 or 1] BOOL型(int型) 4 [TRUE or FALSE] sbyte型(有符号8位整数) 1 [128 ~ 127] bytet型(无符号8位整数) 8U 2 [0 ~ 255] short型(有符号16位整数) 16S 2 [-32,768 ~ 32,767] ushort型(无符号16位整数) 16U 2 [0 ~ 65,535] int型(有符号32位整数) 32S 4 [

    2024年02月03日
    浏览(56)
  • 【C++】详解用标准库的std::mt19937生成随机数

    2023年8月16日,周三晚上 写了1个半小时 目录 概述 英文文档 什么是mt19937 什么是状态大小 头文件 std::mt19937的常用成员函数 1. 构造函数: 2. 种子操作函数: 3. 随机数生成函数: 4. 辅助函数: 生成种子值 方法1:使用std::random_device 方法2:使用时间戳 举例说明 英文文档 std:

    2024年01月17日
    浏览(48)
  • C++语言Qt实现 实时任务调度仿真软件 任务参数可配置和随机生成支持多核调度

    我遇到个需求: 目标: 开发一个实时任务调度仿真软件,我们在学习操作系统这门课时候,经常需要观察任务动态调度情况,来更好的直观学习操作系统任务调度过程和调度算法。 内部原理: 操作系统任务调度实际上是一个有限状态机,任务的各种状态不断的转换过程,我

    2023年04月25日
    浏览(37)
  • C++:A、B维度矩阵生成

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 给定两个矩阵A和B,它们的维度相同,行数和列数分别都是2001和3001。要求:1)按照不同的指个矩阵A和B的元

    2024年02月03日
    浏览(32)
  • 编程导航算法通关村第 1 关|青铜 - C++是如何构造出链表的

             在C++中,链表是由一系列节点构成的,每个节点包含一个值和一个指向下一个节点的指针。         我们可以用结构体定义出一个节点:               在定义完后,我们将链表进行初始化,并插入5条数据:   接着我们在主函数中进行测试,看看是否能成

    2024年02月13日
    浏览(41)
  • 随机采样一致性(RANSAC)三维点云的平面拟合算法(含C++代码)

            随机采样一致性(Random sample consensus,RANSAC) :RANSAC是一种鲁棒的模型拟合方法,它可以处理存在大量噪声和异常值的数据。在进行平面拟合时,RANSAC会随机选择三个点,然后计算这三个点确定的平面模型。然后,RANSAC会计算其他所有点到这个平面的距离,并根据

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包