有哪些易用的c++矩阵库? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问时复制粘贴 AI 生成的内容
omengye
V2EX    程序员

有哪些易用的c++矩阵库?

  •  
  •   omengye
    omengye 2013-11-08 00:33:06 +08:00 7935 次点击
    这是一个创建于 4433 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人c++小白,一直在用c++的形式来写c。。。今天试了一下据说速度很快Eigen,可是随意求一3×3矩阵特征值的编译时长都超过10秒。。。而且所求的特征值貌似不支持复数,只显示其实部。在matlab里求同样的矩阵的特征值都是秒出结果。请教下各位大大们哪些库能快速处理矩阵?能达到matlab处理时间的就行。
    第 1 条附言    2013-11-08 19:23:41 +08:00
    Armadillo + openblas 貌似是一个很好的组合
    35 条回复    1970-01-01 08:00:00 +08:00
    txx
        1
    txx  
       2013-11-08 00:43:58 +08:00
    3*3的矩阵 10秒.......开玩笑啊 时间复杂度也就N^2啊...
    omengye
        2
    omengye  
    OP
       2013-11-08 00:47:03 +08:00 via Android
    @txx msvc mingw都试过了。。。不知为何
    dndx
        3
    dndx  
       2013-11-08 04:57:56 +08:00 via iPhone
    估计是使用方法不对吧,3 X 3 都要10秒,这比手算也快不到哪去了。
    qiukun
        4
    qiukun  
       2013-11-08 07:55:18 +08:00
    编译时长?
    forest520
        5
    forest520  
       2013-11-08 07:57:14 +08:00 via Android
    clapack吧,这个最原始,编译最简单
    omengye
        6
    omengye  
    OP
       2013-11-08 08:32:35 +08:00 via Android
    @dndx 我看它文档上写的只需要添加eigen的include目录就可以用了
    omengye
        7
    omengye  
    OP
       2013-11-08 08:35:05 +08:00 via Android
    @qiukun 是的,有哪里不对么
    omengye
        8
    omengye  
    OP
       2013-11-08 08:35:57 +08:00 via Android
    @forest520 谢谢,我试一试
    xdeng
        9
    xdeng  
       2013-11-08 09:45:57 +08:00
    第一次 编译久 之后就不会了吧
    Golevka
        10
    Golevka  
       2013-11-08 09:46:25 +08:00   1
    估计又是header only, template满天飞的东西所以编译慢. (据说一哥们用spirit写了个scheme解释器, build出来要半小时
    omengye
        11
    omengye  
    OP
       2013-11-08 10:09:16 +08:00
    @xdeng 还是会...
    ini
        12
    ini  
       2013-11-08 10:12:30 +08:00   1
    哥,如果include的template或者header很多,编译时长超过10秒很正常啊,之后再编译应该就快了啊。
    你最主要的还是要看运行速度啊,如果运行速度没问题,那就OK了嘛。
    omengye
        13
    omengye  
    OP
       2013-11-08 10:14:54 +08:00
    @Golevka 是的,确实是这样子.有什么建议么?
    skydiver
        14
    skydiver  
       2013-11-08 10:19:43 +08:00
    一直在用c++的形式来写c。。。这是什么意思。。能编译么。。
    omengye
        15
    omengye  
    OP
       2013-11-08 10:30:52 +08:00
    @ini 比如

    #include <iostream>
    #include <Eigen/Eigen>

    using namespace Eigen;
    using namespace std;

    int main()
    {
    Matrix3d a(3,3);
    a<< 1,0,0,
    0,1,0,
    0,0,1;
    cout << "a: " << endl << a << endl;
    cout << "eigenvalue: " <<endl<< a.eigenvalues() << endl;
    }

    这个都能20s ...真是服了
    omengye
        16
    omengye  
    OP
       2013-11-08 10:38:10 +08:00
    @skydiver 比如用vector写循环之类的,见笑了
    ini
        17
    ini  
       2013-11-08 10:40:35 +08:00
    ini
        18
    ini  
       2013-11-08 10:51:12 +08:00
    @omengye 我去,一不小心敲了XX,然后就莫名其妙地回复了。。
    我刚看了一下这个lib,<Eigen/Eigen>里include了Dense,下面是Dense header里面的include:

    ```
    #include "Core"
    #include "LU"
    #include "Cholesky"
    #include "QR"
    #include "SVD"
    #include "Geometry"
    #include "Eigenvalues"
    ```

    再随便打开Core这个header,里面又include了一大堆,以"src/Core/PlainObjectBase.h"为例,再打开这个header only的源文件,里面全是template,这能不慢么。。

    表面看起来,只include了一个<Eigen/Eigen>,但这只是这个lib为了方便,做了一个统一的header,其实里面所有的内容都被包含了,所以,如果你要编译速度,你可以只include你需要的那个header,应该就会好很多了。

    ----------------------------------

    另外,你说除了第一次以外,以后编译也很慢,你是只有一个main.cpp么?
    ini
        19
    ini  
       2013-11-08 10:52:32 +08:00
    发现V2EX不支持markdown嘛,看起来好像支持markdown的样子。。
    omengye
        20
    omengye  
    OP
       2013-11-08 11:04:23 +08:00
    @ini 是只有一个main.cpp, 太感谢了
    xdeng
        21
    xdeng  
       2013-11-08 11:09:55 +08:00
    @omengye 怎么可能。。。第一次生成库的 obj 后之后就不用了吧。。。
    Ricepig
        22
    Ricepig  
       2013-11-08 11:23:31 +08:00
    所以build和clean后再build对C/C++来说,时间差异很大
    weigetc
        23
    weigetc  
       2013-11-08 12:28:49 +08:00
    xiaket
        24
    xiaket  
       2013-11-08 14:17:40 +08:00
    Intel的Math Kernel Library, 这个省心, 常见的BLAS, LAPACK什么的都集成到里面了.

    正确使用的话, 速度比MATLAB快应该是可以肯定的.
    bububut
        25
    bububut  
       2013-11-08 14:22:31 +08:00
    目前在用这个
    http://arma.sourceforge.net/

    一般人家说某某库速度快是指运行速度快吧,编译速度快这个要求倒是比较难考察
    如果你是常常要改变矩阵值的话,直接写个读文件的程序,就不用每次都编译啦

    为什么不直接拿matlab算呢
    cdfmr
        26
    cdfmr  
       2013-11-08 15:48:00 +08:00
    使用预编译头文件可以提高编译速度
    omengye
        27
    omengye  
    OP
       2013-11-08 16:17:35 +08:00
    omengye
        28
    omengye  
    OP
       2013-11-08 16:23:42 +08:00
    @bububut 谢谢,主要是想脱离matlab,所以不愿再拿它来算了
    Ricepig
        29
    Ricepig  
       2013-11-08 16:49:31 +08:00
    @xiaket 这个太贵了。。。
    ispinfx
        30
    ispinfx  
       2013-11-08 17:19:33 +08:00
    别搞笑了。。毕业设计的时候自己写的求6W阶的特征值都都用不了几秒。
    omengye
        31
    omengye  
    OP
       2013-11-08 17:30:02 +08:00
    @ispinfx 嗯,自己写当然就没这么多事了
    xiaket
        32
    xiaket  
       2013-11-08 23:54:08 +08:00
    @Ricepig 那就找来BLAS和LAPACK, 这两个是开源的. 需要自己折腾下, 不过折腾的成本也不高, 正常的话半天可以搞定.
    Ricepig
        33
    Ricepig  
       2013-11-09 00:25:58 +08:00
    @xiaket fortran的。。。
    omengye
        34
    omengye  
    OP
       2013-11-09 00:31:34 +08:00 via Android
    @xiaket @Ricepig 用上了armadillo和openblas组合的方式,貌似还不错
    xiaket
        35
    xiaket  
       2013-11-09 07:27:44 +08:00
    @Ricepig 貌似很容易就可以找到for c/c++的实现哦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2680 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 09:15 PVG 17:15 LAX 01:15 JFK 04:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86