理解WEIBO源码(一)
理解WEIBO源码(一)
- C++
- 结构体和枚举
- 矩阵库Eigen常用操作
C++
结构体和枚举
1.结构体里可以定义不同类型的数据,e.g. 字符串、数组、指针、整型等。
typedef struct circuit //用typedef定义一个结构体circuit
{size_t num_mos;float gain;
}oa;//结构体变量oa
2.枚举里都是整型常量,默认情况下,枚举值从0开始,依次加1。如果没有显式地提供初始值,则当前枚举成员的值等于之前枚举成员的值加1。
(1)限定作用域的枚举类型(scoped enumeration)
在枚举类型的作用域外是不可访问的。
enum class peppers {red, yellow, green}; //class 或者 struct关键字不能省略
peppers p2 = peppers::red; //正确,访问red需要加上peppers类型限定符
peppers p = red; //错误,red不可以直接访问
(2)不限定作用域的枚举类型(unscoped enumeration)
在枚举类型的作用域外是可以访问的。枚举成员的作用域与枚举类型本身的作用域相同。
enum color {red, yellow, green}; //省略class 或者struct关键字
color eyes = green; //正确,green的作用域与color的作用域相同
在WEIBO.h的139~148行。
enum WEIBO_Status {Running = 0, /**< WEIBO optimizer is running normally */NAN_INF, /**< The objective function value is NaN or Inf */// to stopMin_EI, /**< The optimized EI is below `_min_EI`, the optimizer is going to stop */Min_PF, /**< The optimized PF is below `_min_PF`, the optimizer is going to stop */Invalid_EI, /**< The optimized wEI is NaN or Inf, the opitmizer is going to stop */Max_Eval, /**< The optimizer has reached its maximum number of iterations */Failure, /**< generic failure */};
在WEIBO.cpp的495行。
WEIBO_Status s = WEIBO_Status::Running;
enum类型经常用在switch语句的表达式中,将枚举值作为case标签。在WEIBO.cpp的515~530行。
switch (s){case WEIBO_Status::Running:break;case WEIBO_Status::NAN_INF: // the previous evaluation meet NaN/INF result, random sampling{MatrixXd x;RowVectorXd y;_random_eval(x, y);_gp->add_data(x, y);break;}default:finished = true;break;}
矩阵库Eigen常用操作
Eigen矩阵定义
#include //头文件
MatrixXd A; //定义行列不固定的double型矩阵A。定义的时候如果不初始化,指针会在内存中乱指,运行会报错。不过Matrix3f A;就可以先定义之后再赋值,因为3f相当于已经初始化了。
VectorXd x; //double型的列向量。
Eigen矩阵大小赋值
// Eigen // comments
x.size() // vector size
A.rows() // number of rows
A.cols() // number of columns
x(i) // Matlab数组下标从1开始,c++从0开始。访问向量
A(i, j) //访问矩阵
A << 1, 2, 3, // 给矩阵A赋值,Eigen重载了<<,故可用<<赋值4, 5, 6, 7, 8, 9;
A.fill(10); // Fill A with all 10's.
Eigen特殊矩阵生成
MatrixXd::Identity(rows,cols) // eye(rows,cols)单位阵,主对角元素全为1
A.setIdentity(rows,cols) // A = eye(rows,cols)
MatrixXd::Zero(rows,cols) // zeros(rows,cols)所有元素全为0
A.setZero(rows,cols) // A = zeros(rows,cols)
MatrixXd::Ones(rows,cols) // ones(rows,cols)所有元素全为1
A.setOnes(rows,cols) // A = ones(rows,cols)
MatrixXd::Random(rows,cols) // uniform random numbers in (-1, 1)随机阵
A.setRandom(rows,cols)
Eigen矩阵转置
A.adjoint() // 转置
A.transpose() // 转置
A.diagonal() // 取主对角元素
Eigen矩阵特征值特征向量
A.eigenvalues(); // 求特征值;注意没有A.eigenvectors()!
EigenSolver lyz(A); // 此处A为3x3矩阵,同时求出特征值和特征向量赋值给lyz。此处lyz的类型?结构体?
lyz.eigenvalues(); // 求特征值
lyz.eigenvectors(); // 求特征向量
Eigen矩阵元素运算
R = P.cwiseProduct(Q); // 相当于matlab中的R = P .* Q,即矩阵中各个对应元素相乘
R = P.cwiseQuotient(Q); // 矩阵中各个对应元素相除
R = P.replicate(rows, cols); // P可为单一变量,将P复制rows行,cols列构成新矩阵R
关于Eigen的详细操作猛击此处.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
