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
库如下有几个优点:文章来源:https://www.toymoban.com/news/detail-741612.html
- 函数可扩展性提升。
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模板网!