句芒算法(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;j
data[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倍以上。
等我以后有时间再去写句芒做矩阵运算的时候的具体实现算法吧。