一、时间计时
ctime,windows.h,sys/time.h,Timer.h的比较说明及压缩包时间计时下载
跨平台运行时间计时Timer.h,可以在Unix/Linux/Mac and Windows system使用,使用demo:
#include
#include "Timer.h"
using namespace std;
int main()
{
Timer timer;
// start timer
timer.start();
// do something
...
// stop timer
timer.stop();
// print the elapsed time in millisec
cout << timer.getElapsedTimeInMilliSec() << " ms.\n";
return 0;
}
获得Linux系统时间,精确到毫秒级
#include
#include
#include
void sysLocalTime(void)
{
time_t timesec;
struct tm *t;
time(×ec);
t = localtime(×ec);
printf("%d-%d-%d %d:%d:%d\n", 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
}
void sysUsecTime(void)
{
struct timeval tv;
struct timezone tz;
struct tm *t;
gettimeofday(&tv, &tz);
printf("tv_sec:%ld\n",tv.tv_sec);
printf("tv_usec:%ld\n",tv.tv_usec);
printf("tz_minuteswest:%d\n",tz.tz_minuteswest);
printf("tz_dsttime:%d\n",tz.tz_dsttime);
t = localtime(&tv.tv_sec);
printf("time_now:%d-%d-%d %d:%d:%d.%ld\n", 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec);
}
int main(void)
{
sysLocalTime();
sysUsecTime();
return 0;
}
详细的#include
https://blog.csdn.net/chenyiming_1990/article/details/8682552#commentBox
详细的#include
https://www.cnblogs.com/jordan-tao/archive/2012/11/03/linux_sys_times.html
博客园https://www.cnblogs.com/chars/p/4975460.html
Linux系统各类时间解释:https://blog.csdn.net/caoleiwe/article/details/78468825?utm_source=blogxgwz4
二、线性加速库
博客https://blog.csdn.net/houston11235/article/details/8501135经过实验验证eigen比opencv快的不止半点。学习一个新的库,我喜欢了解两点:熟悉大致的包含模块,demo。
2.1模块
Eigen(点击此处进入官网,内含丰富的Eigen信息)功能类似与MATLAB矩阵运算很方便,是C++中可以用来调用并进行矩阵计算的一个库,直接将库下载后放在项目目录下,然后包含头文件就能使用,Eigen里面封装了一些类,需要的头文件和功能如下:
#include
#include
所以一般包含
类型:
动态矩阵是指其大小在运行时确定,静态矩阵是指其大小在编译时确定,在Eigen中并未这样称呼矩阵。
矩阵定义:
#include
Matrix A; // Fixed rows and cols. Same as Matrix3d.
Matrix B; // Fixed rows, dynamic cols.
Matrix C; // Full dynamic. Same as MatrixXd.
Matrix E; // Row major; default is column-major.
Matrix3f P, Q, R; // 3x3 float matrix.
Vector3f x, y, z; // 3x1 float matrix.
RowVector3f a, b, c; // 1x3 float matrix.
VectorXd v; // Dynamic column vector of doubles
// Eigen // Matlab // comments
x.size() // length(x) // vector size
C.rows() // size(C,1) // number of rows
C.cols() // size(C,2) // number of columns
x(i) // x(i+1) // Matlab is 1-based
C(i,j) // C(i+1,j+1) //
矩阵基本使用与初始化:
// Basic usage
// Eigen // Matlab // comments
x.size() // length(x) // vector size
C.rows() // size(C,1) // number of rows
C.cols() // size(C,2) // number of columns
x(i) // x(i+1) // Matlab is 1-based
C(i, j) // C(i+1,j+1) //
A.resize(4, 4); // Runtime error if assertions are on.
B.resize(4, 9); // Runtime error if assertions are on.
A.resize(3, 3); // Ok; size didn't change.
B.resize(3, 9); // Ok; only dynamic cols changed.
//初始化 // Matlab
MatrixXd::Identity(rows,cols) // eye(rows,cols)
C.setIdentity(rows,cols) // C = eye(rows,cols)
MatrixXd::Zero(rows,cols) // zeros(rows,cols)
C.setZero(rows,cols) // C = ones(rows,cols)
MatrixXd::Ones(rows,cols) // ones(rows,cols)
C.setOnes(rows,cols) // C = ones(rows,cols)
MatrixXd::Random(rows,cols) // rand(rows,cols)*2-1 // MatrixXd::Random returns uniform random numbers in (-1, 1).
C.setRandom(rows,cols) // C = rand(rows,cols)*2-1
VectorXd::LinSpaced(size,low,high) // linspace(low,high,size)'
v.setLinSpaced(size,low,high) // v = linspace(low,high,size)'
//exam
m1 = MatrixXf::Zero(3,4); //用0矩阵初始化,要指定行列数
m2 = MatrixXf::Zero(4,3);
m3 = MatrixXf::Identity(3,3); //用单位矩阵初始化
v1 = Vector3f::Zero(); //同理,若是静态的,不用指定行列数
A << 1, 2, 3, // Initialize A. The elements can also be
4, 5, 6, // matrices, which are stacked along cols
7, 8, 9; // and then the rows are stacked.
B << A, A, A; // B is three horizontally stacked A's.
A.fill(10); // Fill A with all 10's.
元素访问:
在矩阵的访问中,行索引总是作为第一个参数,需注意Eigen中遵循大家的习惯让矩阵、数组、向量的下标都是从0开始。矩阵元素的访问可以通过()操作符完成,例如m(2,3)即是获取矩阵m的第2行第3列元素(注意行列数从0开始)
运算:
//矩阵乘积、加减
// All the same as Matlab, but matlab doesn't have *= style operators.
// Matrix-vector. Matrix-matrix. Matrix-scalar.
y = M*x; R = P*Q; R = P*s;
a = b*M; R = P - Q; R = s*P;
a *= M; R = P + Q; R = P/s;
R *= Q; R = s*P;
R += Q; R *= s;
R -= Q; R /= s;
//矩阵点乘
// Dot products, norms, etc.
// Eigen // Matlab
x.norm() // norm(x). Note that norm(R) doesn't work in Eigen.
x.squaredNorm() // dot(x, x) Note the equivalence is not true for complex
x.dot(y) // dot(x, y)
x.cross(y) // cross(x, y) Requires #include
//类型转换
//// Type conversion
// Eigen // Matlab
A.cast(); // double(A)
A.cast(); // single(A)
A.cast(); // int32(A)
A.real(); // real(A)
A.imag(); // imag(A)
// if the original type equals destination type, no work is done
Eigen矩阵单个元素操作:
// Vectorized operations on each element independently
// Eigen // Matlab
R = P.cwiseProduct(Q); // R = P .* Q
R = P.array() * s.array();// R = P .* s
R = P.cwiseQuotient(Q); // R = P ./ Q
R = P.array() / Q.array();// R = P ./ Q
R = P.array() + s.array();// R = P + s
R = P.array() - s.array();// R = P - s
R.array() += s; // R = R + s
R.array() -= s; // R = R - s
R.array() < Q.array(); // R < Q
R.array() <= Q.array(); // R <= Q
R.cwiseInverse(); // 1 ./ P
R.array().inverse(); // 1 ./ P
R.array().sin() // sin(P)
R.array().cos() // cos(P)
R.array().pow(s) // P .^ s
R.array().square() // P .^ 2
R.array().cube() // P .^ 3
R.cwiseSqrt() // sqrt(P)
R.array().sqrt() // sqrt(P)
R.array().exp() // exp(P)
R.array().log() // log(P)
R.cwiseMax(P) // max(R, P)
R.array().max(P.array()) // max(R, P)
R.cwiseMin(P) // min(R, P)
R.array().min(P.array()) // min(R, P)
R.cwiseAbs() // abs(P)
R.array().abs() // abs(P)
R.cwiseAbs2() // abs(P.^2)
R.array().abs2() // abs(P.^2)
(R.array() < s).select(P,Q); // (R < s ? P : Q)
m.col(1).normalize()//表示对矩阵 m 列标为 1 的列向量进行单位化。
数据存储:Matrix创建的矩阵默认是按列存储,Eigen在处理按列存储的矩阵时会更加高效。果想修改可以在创建矩阵的时候加入参数,如:
Matrix
Matrix
了解:
如何选择动态矩阵和静态矩阵:
对于小矩阵(一般大小小于16)使用固定大小的静态矩阵,它可以带来比较高的效率;对于大矩阵(一般大小大于32)建议使用动态矩阵。注意:如果特别大的矩阵使用了固定大小的静态矩阵则可能会造成栈溢出的问题
使用:
参考文献
安装:https://blog.csdn.net/ttomchy/article/details/56859841
hello world: http://www.cnblogs.com/rainbow70626/p/8819119.html
https://blog.csdn.net/piaoxuezhong/article/details/58055709