我需要对矩阵进行乘法运算。我正在寻找一个可以快速完成的库。我正在使用Visual C ++ 2008编译器,我有一个核心i7 860,所以如果库已针对我的配置进行了优化,那么它就是完美的。
答案 0 :(得分:7)
FWIW,Eigen 3对矩阵产品使用线程(OpenMP)(回复上面关于Eigen不使用线程的声明)。
答案 1 :(得分:6)
BLAS是所有基本线性代数运算的事实上的Fortran标准(基本上是矩阵和向量的乘法)。有许多实现可用。例如:
然后,您可能想要使用C ++包装器,例如boost::ublas
。
如果您在分布式系统上进行编程,则可以使用PBLAS和ScaLAPACK,以便为分布式线性代数运算使用消息传递。在多核机器上,通常BLAS(至少是英特尔MKL)的实现使用线程来获得足够大的矩阵。
如果你想要更高级的线性代数例程(特征值,线性系统,最小二乘......),那么还有另一个事实上的Fortran标准LAPACK。据我所知,除了调用简单的Fortran例程之外,没有什么可以优雅地与C ++集成。您必须编写一些包装器来隐藏Fortran调用并提供声音类型检查实现。
答案 2 :(得分:5)
查看Eigen。它应该拥有你所需要的一切。
答案 3 :(得分:3)
我对Boost的uBLAS有很好的经验。如果您已经在使用Boost,这是一个不错的选择。
答案 4 :(得分:1)
您可以使用GNU Scientific Library(GSL)。
这是一个描述库中可用矩阵运算的页面,包括乘法(gsl_matrix_mul_elements()):
http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html
以下是一些链接,可帮助您开始在Visual Studio中使用GSL:
http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php
答案 5 :(得分:1)
它不能与科学图书馆竞争,但使用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;
}
因此,您可以轻松地获取矩阵乘法障碍(在Windows上)
答案 6 :(得分:0)
对于更新版本的Visual Studio,您可以使用ScaLapack + MKL。 我们提供了一些代码示例here,以及如何使其运行的教程。
http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content
答案 7 :(得分:-1)
有一个选项可以自己实现,也许使用std :: valarray因为可以使用OpenMP进行并行化:gcc当然有这样的版本,MSVC ++也可能会这样做。
否则,以下技巧:其中一个矩阵应该被转置。然后你有:
AB [i,j] = Sum(k)A [i,k] B ^ t [j,k]
您正在扫描连续的内存。如果你有8个核心,你可以很容易地将[i,j]索引的集合划分为8,并给每个核心提供总工作的1/8。为了使速度更快,您可以使用向量乘法指令,大多数编译器将为此提供特殊功能。结果不会像调优的库一样快,但应该没问题。
如果您正在进行更长时间的计算,例如多项式求值,那么同时具有线程支持(gak,两种线程)的线程评估器也会做得很好,即使它不会进行低级别调整。如果你真的想快速做事,你必须使用像Atlas这样经过适当调整的库,但是如果你认真对待HPC,你可能不会运行Windows。