V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
omengye
V2EX  ›  程序员

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

  •  
  •   omengye ·
    omengye · 2013-11-08 00:33:06 +08:00 · 7500 次点击
    这是一个创建于 4039 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人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   ·   实用小工具   ·   5856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 02:48 · PVG 10:48 · LAX 18:48 · JFK 21:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.