欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

句芒算法(morn)详情:矩阵运算

程序员文章站 2022-08-04 14:26:56
句芒算法(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的矩阵

句芒算法(morn)详情:矩阵运算

结果一点可解释的东西都没有,完全符合预期。

对比一下eigen

eigen是一个高层次的c ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法(这句是从百度百科copy的),为啥要和eigen比,因为它用的广泛。

eigen的程序就不贴了,截个结果图看一下:
句芒算法(morn)详情:矩阵运算

可以看到句芒和eigen的结果是完全一样的,说明算对了。

性能

上面的结果也看到了,对于8×8这种简单的矩阵,句芒和eigen都很快,快到测不出耗时。

那现在把测试的矩阵放大一点。先用200×200的矩阵,看一下结果(矩阵就不打印出来了)
句芒算法(morn)详情:矩阵运算

差距就很明显了,句芒要快得多得多(这里的单位是100ns,不过这个耗时跟电脑的硬件有关,绝对值没啥意义,对比才有意义),是吧。

再试一下1000×1000的矩阵,看一下结果:
句芒算法(morn)详情:矩阵运算

更大的矩阵就不测了,实在没有耐心等到它出结果。
结论很明显了,句芒比eigen要快10倍以上。


等我以后有时间再去写句芒做矩阵运算的时候的具体实现算法吧。