理解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的详细操作猛击此处.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部