eigen源码解析
(2017-04-05 13:25:37)| 分类: 计算技术 |
eigen是强大的开源矩阵库,支持很多典型的矩阵运算,我第一次看到下面的代码时,楞了一下:
int main(){
MatrixXf m1(3, 4);//动态矩阵,建立3行4列。 MatrixXf m2(4, 3);//4行3列,依此类推。 m1 = MatrixXf::Zero(3, 4);//用0矩阵初始化,要指定行列数 m2 = MatrixXf::Zero(4, 3);m1 << 1, 0, 0, 1,//这是啥东西?????????? 1, 5, 0, 1,0, 0, 9, 1;
}
看了源代码后,我靠,原来是这点小把戏啊,这个家伙居然重载了","运算符。下面是我乱写的代码,看懂了这个代码,也就明白为什么了。
#include#includeusing namespace std;class myvector: vector < double >{public:
myvector& operator<<(const double d){vector::clear();
vector::push_back(d);return *this;
}myvector& operator,(const double d){
vector::push_back(d);return *this;
}myvector& operator=(const vector < double > &d){
vector::operator = (d);return *this;
}
};int main(){
myvector v;v << 1, 2, 3, 4, 5, 6, 7;// 实现了和eigen库同样的赋值方式! v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 两种方法,结果一致,效率可能不一样
}
更多的乱七八糟代码:
#include
#include
using namespace std;
class myvector: vector < double >
{
public:
myvector& operator<<(const double d){vector::clear();
vector::push_back(d);return *this;
}myvector& operator,(const double d){
vector::push_back(d);return *this;
}myvector& operator=(const vector < double >&d) {
vector::operator = (d);return *this;
}
};
class matrix :vector< vector < double
> >
{
public:
matrix(){}matrix(vector< const vector < double >> & a) {
(*this) = a;
}matrix& operator=(const vector< vector< double > > & a) {
vector< vector < double > > ::operator=(a);int max = 0;int i = 0;for (i = 0; i < a.size(); ++i){
if (a[i].size() > max)
max = a[i].size();
}for (i = 0; i < a.size(); ++i){
this->operator[](i).resize(max);
}return *this;
}
};
int main()
{
myvector v;v << 1, 2, 3, 4, 5, 6, 7;v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };matrix m;//{ { 1, 2 }, { 3, 4 } };m = { { 1, 2, 3, 5}, { 4, 5, 6 }, { 7, 8, 9 }, {10,11,12} };return 0;
}

加载中…