C++ 什么';这是一个很好的C++;矩阵运算库

C++ 什么';这是一个很好的C++;矩阵运算库,c++,optimization,matrix,C++,Optimization,Matrix,我需要做矩阵乘法。我在找一个能快速完成的图书馆。我使用Visual C++ 2008编译器,我有一个i7内核860,所以如果库对于我的配置是优化的,它是完美的。它应该有你所需要的一切。我对Boost有很好的经验。如果您已经在使用Boost,这是一个不错的选择。您可以使用 这里有一页描述了库中可用的矩阵运算,包括乘法(gsl_matrix_mul_elements()): 下面是一些链接,帮助您开始在visual studio中使用GSL: 有一个选项可以自己实现,可能是使用std::vala

我需要做矩阵乘法。我在找一个能快速完成的图书馆。我使用Visual C++ 2008编译器,我有一个i7内核860,所以如果库对于我的配置是优化的,它是完美的。它应该有你所需要的一切。

我对Boost有很好的经验。如果您已经在使用Boost,这是一个不错的选择。

您可以使用

这里有一页描述了库中可用的矩阵运算,包括乘法(gsl_matrix_mul_elements()):

下面是一些链接,帮助您开始在visual studio中使用GSL:


有一个选项可以自己实现,可能是使用std::valarray,因为它可以使用OpenMP并行化:gcc肯定有这样一个版本,MSVC++可能也有

否则,请使用以下技巧:其中一个矩阵应进行转置。那么你有:

AB[i,j]=和(k)A[i,k]B^t[j,k]

您正在扫描连续内存的位置。如果你有8个核心,你可以相当容易地将[i,j]索引集划分为8个,并给每个核心分配总作业的1/8。为了更快地使用向量乘法指令,大多数编译器都会为此提供一个特殊的函数。结果不会像调整过的库那么快,但应该可以


如果您正在进行更长的计算,例如多项式计算,那么同样具有线程支持(gak,两种线程)的线程计算器将做得很好,即使它不会进行低级调优。如果你真的想快速地完成任务,你必须使用一个像阿特拉斯这样的正确调整的库,但是如果你对HPC很认真,那么你可能不会运行Windows。

< P>它不能与科学图书馆竞争,但是用Visual C++来完成它是在

#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;

int main()
{
    ULONG_PTR gpToken = 0;
    GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
    //lib inited

    Matrix A;
    A.Translate(10,20);

    Matrix B;
    B.Rotate(35.0);

    A.Multiply(&B);
    if (A.IsInvertible())
        A.Invert();
    if (!A.IsIdentity())
        A.RotateAt(120.0, PointF(10,10));

    //getting values
    REAL elements[6];
    A.GetElements(elements);

    //lib stopped
    GdiplusShutdown(gpToken);
    return 0;
}
#包括
#包括
#pragma注释(lib,“Gdiplus.lib”)
使用名称空间Gdiplus;
int main()
{
ULONG_PTR gpToken=0;
GdiplusStartup(&gpToken,&GdiplusStartupInput(),NULL);
//lib初始化
基质A;
A.翻译(10,20);
矩阵B;
B.旋转(35.0);
A.乘法(&B);
如果(A.isInvertable())
A.倒置();
如果(!A.IsIdentity())
A.RotateAt(120.0,f点(10,10));
//获取价值
实元素[6];
A.要素(要素);
//lib停止了
GdiplusShutdown(gpToken);
返回0;
}
因此,您可以轻松克服矩阵乘法的障碍(在Windows上)


BLAS是所有基本线性代数运算(本质上是矩阵和向量的乘法)的事实上的Fortran标准。有许多可用的实现。例如:

  • ATLAS是免费的,据说是自我优化的。不过,您需要自己编译它
  • Goto BLAS由TACC的Kazushige Goto负责维护。他非常擅长从现代处理器中获得最后一点性能。不过,这只是学术用途
  • 英特尔MKL为英特尔处理器提供优化的BLAS。它不是免费的,甚至用于学术用途

那么,您可能希望使用C++包装器,例如:代码> Boo::UBLAS < /C> > < /P> 如果您在分布式系统上编程,则有PBLA和ScaLAPACK,它们支持在分布式线性代数运算中使用消息传递。在多核计算机上,BLAS(至少是Intel MKL)的实现通常使用线程来处理足够大的矩阵


如果您想要更高级的线性代数例程(特征值、线性系统、最小二乘法等等),那么还有另一个事实上的Fortran标准LAPACK。据我所知,除了调用Fortran FORTRAN程序之外,没有什么可以与C++相比优雅地集成它。您必须编写一些包装来隐藏Fortran调用并提供一个声音类型检查实现。

FWIW,Eigen 3对矩阵产品使用线程(OpenMP)(作为对上述关于Eigen不使用线程的声明的回复)。

对于更新版本的Visual Studio,您可以使用ScaLapack+MKL。 提供了一个代码示例,以及如何使其运行的教程


LAPACK+BLAS可以获得大部分的东西吗?Gnu代码在MSVC++上的编译?我的意思是,如果你真的想获得性能,你会使用基于Atlas的BLAS,但我怀疑在Windows上构建它会有那么容易:)它使用系统上安装的BLAS库。英特尔提供了一个使用线程和向量指令的系统:google for Intel MKL。但它不是免费的。我在Boost的uBLAS上有过一次非常可怕的经历。这完全是不直观的,很难理解。例如,我怎么知道向量矩阵乘法是使用
prod()
——为什么不使用
*
操作符?而且,我甚至不能将两个向量相乘。永远不要自己实现矩阵运算。使用BLAS实现。Eigen只擅长于小矩阵。对于较大的矩阵,它不使用线程。但它在可用时使用SSE2。好吧,他们自己的基准显示了不同的。。。见鬼,如果您真的需要,线程可以通过执行块产品由用户实现。