用于C ++的NumPy风格的数组?

有没有任何C + +(或C)库有类似NumPy的数组,支持切片,vector化操作,逐个元素添加和减less内容等。

这里有几个免费的软件可以满足你的需求。

  1. GNU科学图书馆是用C编写的GPL软件。因此,它具有类似于C的分配和编程方式(指针等)。 使用GSLwrap ,您可以使用C ++编程方式,同时仍然使用GSL。 GSL有一个BLAS实现,但是如果你想要更多的表演,你可以使用ATLAS而不是默认的CBLAS。

  2. boost / uBLAS库是一个BSL库,用C ++编写,并作为boost包分发。 这是一个C ++实现BLAS标准的方式。 uBLAS带有一些线性代数函数,并且有对ATLAS的实验性绑定 。

  3. eigen是一个线性代数库,用C ++编写,分布在LGPL3(或GPL2)下。 这是一种C ++编程方式,但是比其他两种方法(更多的algorithm和数据结构可用)更集成。 Eigen 声称要比上面的BLAS实现更快 ,而不遵循事实上的标准BLAS API。 Eigen似乎并没有在并行实施方面付出很多努力。

  4. Armadillo是在C ++中的LGPL3库。 它绑定了LAPACK (numpy使用的库)。 它使用recursion模板和模板元编程,这是一个很好的观点(我不知道其他库是否也这样做?)。

如果你只是想获得数据结构和基本的线性代数,这些select是非常好的。 根据您对风格,许可证或系统pipe理员挑战的喜好(安装像LAPACK这样的大型图书馆可能比较困难),您可以select最适合您的需求。

试试xtensor 。

xtensor是一个C ++库,用于使用multidimensional arrayexpression式进行数值分析。

xtensor提供

  • 一个可扩展的expression系统,使numpy式广播。
  • 一个遵循C ++标准库的习惯用法的API。
  • 工具来操作数组expression式和构buildxtensor。

初始化一个二维数组并计算其中一行和一维数组的总和。

 #include <iostream> #include "xtensor/xarray.hpp" #include "xtensor/xio.hpp" xt::xarray<double> arr1 {{1.0, 2.0, 3.0}, {2.0, 5.0, 7.0}, {2.0, 5.0, 7.0}}; xt::xarray<double> arr2 {5.0, 6.0, 7.0}; xt::xarray<double> res = xt::view(arr1, 1) + arr2; std::cout << res; 

输出

 {7, 11, 14} 

初始化一维数组并重新定位。

 #include <iostream> #include "xtensor/xarray.hpp" #include "xtensor/xio.hpp" xt::xarray<int> arr {1, 2, 3, 4, 5, 6, 7, 8, 9}; arr.reshape({3, 3}); std::cout << arr; 

输出

 {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 

除此之外,DyND被devise为一个类似于NumPy的C ++库。 像广播,算术运算符和切片一切工作正常。 另一方面,它还是实验性的,还有很多function还没有实现。

下面是使用DyND数组在C ++中实现de Casteljaualgorithm的简单实现:

 #include <iostream> #include <dynd/array.hpp> using namespace dynd; nd::array decasteljau(nd::array a, double t){ size_t e = a.get_dim_size(); for(size_t i=0; i < e-1; i++){ a = (1.-t) * a(irange()<(ei-1)) + t * a(0<irange()); } return a; } int main(){ nd::array a = {1., 2., 2., -1.}; std::cout << decasteljau(a, .25) << std::endl; } 

我稍微写了一篇博文 ,提供了更多的例子,并且比较了Fortran 90,C ++中的DyND和Python中的NumPy的语法。

免责声明:我是现在的DyND开发人员之一。

Eigen是一个很好的线性代数库。

http://eigen.tuxfamily.org/index.php?title=Main_Page

由于它是仅包含标题的库,因此安装起来非常简单。 它依靠模板来生成优化的代码。 它自动vector化matrix运算。

它也完全支持系数明智的操作,例如两个matrix之间的“每元素乘法”。 这是你需要的?

Eigen是线性代数(matrix,向量…)的模板库。 这是只有头和免费使用(LGPL)。

GSL是伟大的,它完成了你所要求的和更多。 它是在GPL下授权的。

Blitz ++支持具有任意轴数的数组,而犰狳只支持三个(向量,matrix和立方体)。 Eigen只支持向量和matrix(不是立方体)。 缺点是Blitz ++除了基本的入门操作和张量收缩之外没有线性代数函数。 相当一段时间以来,发展似乎已经放缓,但也许这只是因为图书馆做了什么,而不需要做太多的改变。

VIGRA包含一个很好的N维数组实现:

http://ukoethe.github.io/vigra/doc/vigra/Tutorial.html

我广泛使用它,并发现它非常简单和有效。 它也只是头文件,所以很容易整合到你的开发环境中。 这是我使用NumPy来处理API的最接近的东西。

主要的缺点是它没有被广泛使用,所以你在网上找不到太多的帮助。 那个,它的名字很尴尬(试着search一下!)

虽然GLM被devise成可以很容易地与OpenGL和GLSL进行网格化,但它是一个function齐全的头文件,只有C ++的math库和一组非常直观的接口。

它声明vector和matrixtypes以及对它们的各种操作。

乘以两个matrix就像(M1 * M2)一样简单。 减去两个vector(V1-V2)。

访问向量或matrix中包含的值同样简单。 例如,在声明一个vec3向量之后,可以使用vector.x访问它的第一个元素。 一探究竟。

所有这些都可以使用作为大多数编译器实现的一部分的标准模板库(STL)。 你看过STL吗?