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()方法的详细说明)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值