摘要:
引言 最近在找C++的数值库,最后终于找到一个近乎完美的eigen,接口优雅,使用方便,速度快,文档详尽。。。 几乎没有缺点,缺点可能是库的设计者要辛苦一些。。。。另外稀疏矩阵的部分还在开发阶段没有完全成熟。 里面提到了矩阵相乘相加等等可以直接用 D =A * B *C 这样写,而不是类似boost::ublas(这个库的好处是在boost下,其它的比eigen差远了。。个人觉得)要写成 prod(A,B)。 为什么ublas不用运算符号重载呢? 原因是效率问题吧,当然A*B的写法更优雅更类似matlab语法了,那么在eigen中采用了lazy evaluation来避免效率问题。 考虑两个. 阅读全文
摘要:
1. 特征值与特征向量 矩阵作用于向量的特殊情况是它能等价于用一个常数作用于该向量。,其中称为特征向量,称为对应于的特征向量,是非0向量。 是A的特征值当且仅当 有非平凡解。 不同特征值对应的特征向量构成的集合线性无关。 对角化 很多情况下A可以做这样的分解D是对角矩阵,这样可以方便求解 。 考虑如果A有n个线性无关的特征向量。 ,其中P由这个n个向量组成,D是对应对角线上取相对应的特征值。 如果不是有n个不同的特征值,但是所有特征值对应的特征向量空间维数之和为n也可以。 2. 正交性与最小二乘法 正交投影, 最佳逼近定理 构造标准正交基的方法 格拉姆-施密特,对应 QR分解 最小二乘问 阅读全文
摘要:
矩阵运算 矩阵加法,标量乘法,矩阵乘法。 A(BC)=(AB)C 矩阵乘法顺序无关 AB=AC 不能推出 B = C 因为A可能不是列向量线性无关。 矩阵的逆 这里讨论的是n*n的方阵,若矩阵可逆逆矩阵是唯一的,存在逆矩阵的矩阵又称为非奇异矩阵。 怎样判断一个矩阵是否存在逆矩阵呢,即是否该矩阵是 非奇异矩阵呢? 对于2*2的矩阵 即detA != 0 则该矩阵是 非奇异矩阵, 注意对于 2*2 如果 detA=0 即ad=bc 则 c/a = d/b 假设 a!=0 b!=0 这意味这 A的列向量是线性相关的! –> 是否线性相关等价与是否非奇异 ? 如果是线性相关的A必然 阅读全文
摘要:
复习下。。。copy 线性代数及其应用 线性方程组 1. 类似 x_1 – 2x_2 = –1 -x_1 + 3x_2 = 3 存在三种情况 1. 无解 2. 有唯一解 3. 有无穷解 考虑两条平行直线,相交的直线,完全重合的直线。 解方程组 行初等变换 (倍加,对换,倍乘) 线性方程组的两个问题 1. 是否至少有一个解? 2.如果有解,是否是唯一的呢? 行化简,阶梯型矩阵,增广矩阵,主元 可以用行初等变换类似解方程组的过程,将任意一个线性方程组转换成一个阶梯型矩阵,如下 1 0 -5 1 0 1 1 4 0 0 0 0 对应 x_1 – 5 x_3 = 阅读全文
摘要:
一个小应用,show下代码,为了推荐下我非常喜欢的glog,gflag:)感谢google 它们让我的生活更轻松:)另外读取数据库用otl相当方便,我用otl封装了下写了一个DBReader,这样处理数据库基本就和处理文本一样了完全相同的接口,完全屏蔽了数据库的操作方便了很多。 /** * ==================================================... 阅读全文
摘要:
ngram模型是统计语言的最基本的模型了,这里将给出用中文语料做实验建立ngram模型的个人总结,主要参考sun拼音2.0的代码以及有点意思拼音输入法,会参考srilmstevejian.cublog.cn。我会尽量逐步完成所有的实验总结。 分词与统计 对于中文语料和英文不同需要我们先进行分词,当然如果是切分好空格隔开的语料就简单许多。假设是普通的语料,sun拼音的做法是采用正向最大匹配分词,并且去掉可能有歧义的部分,当然这些都是首先依赖于词典。 利用词典文本建立一个存储字典中词的索引结构。可以选择hash map,map,trie树等结构,这里选择double array trie作为索引结 阅读全文
摘要:
作者slostice http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 转者注:) 我也是不喜欢继承和虚函数的,耦合度太大,我喜欢STL,boost,CGAL风格的C++。我经常使用的是template, 仿函数,用编译期的多态替代虚函数(见effective c++ 条款41 了解隐式接口和编译期多态)。 例如Example<WriteFunc1,Writer2> example;example.process();这真是C++的伟大灵活之处, m_func可以是任何一个函数对象只要其内部定义了opera 阅读全文
摘要:
原文http://www.cppblog.com/walkspeed/archive/2007/07/20/28448.html当我们使用函数时习惯于C函数的格式,即如下形式resulttype funname( arglist );返回值类型 函数名( 参数列表 );在Boost.Function中,我们可以方便的定义定义函数对象。不过在定义用来表示类成员函数的函数对象时第一个参数是类指针。而且在调用时,要传入一个类实例的指针。这样用起来并不是很方便,因为调用者要知道类实例。这实际上没有实现解耦。而解耦是我们使用回调或委托设计的一个目标。为了解决这个问题,我们要使用Boost.Bind库Bo 阅读全文
摘要:
最近用boost::math库,发现会和我以前的程序冲突。比如我的程序如果用到 #include<tr1/unordered_map> 等等std::tr1名字域下的东西。。。 google了下,原因是boost::tr1设计初衷是为了在你的系统没有std::tr1标准库实现的情况下让你仍然可以在程序中使用std::tr1::unordered_map, std::tr1::tuple等东东,当然了这是一个work around,也就是你其实还是用的boost::tuple等等 只是你的代码写的时候可以写std::tr1::tuple。 比如boost的math库的一个分布函数的 阅读全文
摘要:
如果你经常使用STL算法,那么你会注意到函数对象的传递都是传值的形式如下面的sort, for_each,_Compare __comp 而不是 _Compare& __comp传递引用。这里你是否会疑惑呢,为什么要用传值的形式而不用传递引用呢,毕竟函数对象区别于函数指针的一大优点是自身可以带有状态变量。如下面这个函数对象它是带有一个状态变量a的,其实可以带有更复杂更占内存的变量更多的变量,那么传值的方式肯定有很大的拷贝代价了。现在我有一个应用,读取数据库中的词并统计热门词,现在问题来了,见下面那么言归正传,为什么STL要是使用传值的方式呢??用于传递函数对象呢??? 我觉得是为了下面 阅读全文