句芒算法(morn)详情:矩阵运算
句芒算法(morn)介绍:矩阵运算(一)
因为这两天有人质疑句芒算法的运行速度,想想,我也从来没有测试过,所以被质疑也很正常,所以打算以后测一测,然后顺便介绍一下句芒算法。
因为这是第一次写关于句芒算法的博客,先说一句,句芒算法是一个轻量级的,用纯编写的算法库。
这篇先说一下算法库里最简单的几个矩阵运算。
测试程序
先看一下测试程序,这段程序再简单不过了,就是开了一个n×n的方阵,然后矩阵里的元素赋(0,1)之间的随机值。测试了三种基本的矩阵运算,①首先,算一下这个矩阵的行列式;②如果行列式不为0的话,算一下这个矩阵的逆;③把原来的矩阵乘以逆矩阵,验证一下是不是等于单位矩阵。
#include #include #include "morn_math.h" void main() { int i,j; mornmatrix *mat; mornmatrix *inv; mornmatrix *mul; int size = 8; float det; filetime beg,end; printf("use morn\n"); mat = mornmatrixcreate(size,size,null); inv = mornmatrixcreate(size,size,null); mul = mornmatrixcreate(size,size,null); for(j=0;jdata[j][i] = ((float)rand())/((float)rand_max); printf("\nmat is:\n"); printmat(mat); getsystemtimeasfiletime(&beg); det = mornmatrixdetvalue(mat); getsystemtimeasfiletime(&end); printf("\ndet is %f\n",det); printf("mat determinant time use is %d\n",(end.dwlowdatetime-beg.dwlowdatetime)); if(det==0) return; getsystemtimeasfiletime(&beg); mornmatrixinverse(mat,inv); getsystemtimeasfiletime(&end); printf("\ninv is:\n"); printmat(inv); printf("mat invere time use is %d\n",(end.dwlowdatetime-beg.dwlowdatetime)); getsystemtimeasfiletime(&beg); mornmatrixmul(mat,inv,mul); getsystemtimeasfiletime(&end); printf("\nmul is:\n"); printmat(mul); printf("mat mult time use is %d\n",(end.dwlowdatetime-beg.dwlowdatetime)); mornmatrixrelease(mat); mornmatrixrelease(inv); mornmatrixrelease(mul); }
看一下结果
这里试了一下8×8的矩阵
结果一点可解释的东西都没有,完全符合预期。
对比一下eigen
eigen是一个高层次的c ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法(这句是从百度百科copy的),为啥要和eigen比,因为它用的广泛。
eigen的程序就不贴了,截个结果图看一下:
可以看到句芒和eigen的结果是完全一样的,说明算对了。
性能
上面的结果也看到了,对于8×8这种简单的矩阵,句芒和eigen都很快,快到测不出耗时。
那现在把测试的矩阵放大一点。先用200×200的矩阵,看一下结果(矩阵就不打印出来了)
差距就很明显了,句芒要快得多得多(这里的单位是100ns,不过这个耗时跟电脑的硬件有关,绝对值没啥意义,对比才有意义),是吧。
再试一下1000×1000的矩阵,看一下结果:
更大的矩阵就不测了,实在没有耐心等到它出结果。
结论很明显了,句芒比eigen要快10倍以上。
等我以后有时间再去写句芒做矩阵运算的时候的具体实现算法吧。
上一篇: 林丹汗坐拥蒙古的铁骑 他最后为何会失败呢
下一篇: 贪心算法:C语言的实现详情