new bidimensional array c++ arrays dynamic-arrays

bidimensional - new int c++



NumPy arrays de estilo para C++? (10)

Aquí hay varios programas gratuitos que pueden satisfacer sus necesidades.

  1. La Biblioteca Científica GNU es un software GPL escrito en C. Por lo tanto, tiene una asignación y forma de programación tipo C (punteros, etc.). Con el GSLwrap , puede tener una forma de programación en C ++, mientras sigue usando el GSL. GSL tiene una implementación BLAS , pero puedes usar ATLAS lugar del CBLAS predeterminado, si quieres aún más actuaciones.

  2. La biblioteca boost/uBLAS es una biblioteca BSL, escrita en C ++ y distribuida como un paquete boost. Es una forma en C ++ de implementar el estándar BLAS. uBLAS viene con algunas funciones de álgebra lineal, y existe una vinculación experimental con ATLAS .

  3. Eigen es una biblioteca de álgebra lineal escrita en C ++, distribuida bajo la licencia LGPL3 (o GPL2). Es una forma de programación en C ++, pero más integrada que las otras dos (hay más algoritmos y estructuras de datos disponibles). Eigen afirma ser más rápido que las implementaciones de BLAS anteriores, mientras que no sigue el estándar BLAS API de facto. Eigen no parece poner mucho esfuerzo en la implementación paralela.

  4. Armadillo es la biblioteca LGPL3 para C ++. Tiene enlace para LAPACK (la biblioteca utilizada por numpy). Utiliza plantillas recursivas y meta-programación de plantillas, lo cual es un buen punto (¿no sé si otras bibliotecas también lo están haciendo?).

Estas alternativas son realmente buenas si solo desea obtener estructuras de datos y álgebra lineal básica. Dependiendo de su gusto por el estilo, la licencia o los desafíos de administrador de sistemas (la instalación de bibliotecas grandes como LAPACK puede ser difícil), puede elegir la que mejor se adapte a sus necesidades.

¿Hay alguna biblioteca C ++ (o C) que tenga matrices similares a NumPy con soporte para segmentar, operaciones vectorizadas, sumar y restar contenido elemento por elemento, etc.?


Eigen es una buena biblioteca de álgebra lineal.

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

Es bastante fácil de instalar ya que es una biblioteca solo para encabezados. Se basa en la plantilla para generar código bien optimizado. Vectoriza automáticamente las operaciones matriciales.

También es totalmente compatible con operaciones de coeficientes, como la "multiplicación por elemento" entre dos matrices, por ejemplo. Es lo que necesitas?


El GSL es excelente, hace todo lo que estás pidiendo y mucho más. Es licenciado bajo la GPL sin embargo.


Pruebe xtensor . (Ver la hoja de trucos NumPy a Xtensor ).

xtensor es una biblioteca de C ++ diseñada para el análisis numérico con expresiones matriciales multidimensionales.

xtensor proporciona

  • Un sistema de expresión extensible que permite la difusión de estilo numpy.
  • una API que sigue los modismos de la biblioteca estándar de C ++.
  • herramientas para manipular expresiones matriciales y construir sobre xtensor.

Ejemplo

Inicialice una matriz 2-D y calcule la suma de una de sus filas y una matriz 1-D.

#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;

Salidas

{7, 11, 14}

Inicialice una matriz 1-D y modifíquela in situ.

#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;

Salidas

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


Si bien GLM está diseñado para enlazar fácilmente con OpenGL y GLSL, es una biblioteca matemática de C ++ con un encabezado completamente funcional y con un conjunto de interfaces muy intuitivo.

Declara tipos de vectores y matrices, así como varias operaciones en ellos.

Multiplicar dos matrices es tan simple como (M1 * M2). Resta dos vectores (V1-V2).

Acceder a los valores contenidos en vectores o matrices es igualmente simple. Después de declarar un vector vec3 por ejemplo, uno puede acceder a su primer elemento con vector.x. Echale un vistazo.


Todas estas cosas son posibles utilizando la Biblioteca de plantillas estándar (STL), que está disponible como parte de la mayoría de las implementaciones del compilador. ¿Has mirado a STL?


VIGRA contiene una buena implementación de matriz N-dimensional:

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

Lo uso ampliamente, y lo encuentro muy simple y efectivo. También es solo encabezado, por lo que es muy fácil de integrar en su entorno de desarrollo. Es lo más cercano que he encontrado al usar NumPy en términos de su API.

El principal inconveniente es que no se utiliza tanto como los demás, por lo que no encontrará mucha ayuda en línea. Eso, y su nombre es incómodo (¡intente buscarlo!)


Blitz++ admite matrices con un número arbitrario de ejes, mientras que Armadillo solo admite hasta tres (vectores, matrices y cubos). Eigen solo soporta vectores y matrices (no cubos). La desventaja es que Blitz ++ no tiene funciones de álgebra lineal más allá de las operaciones básicas de entrada y las contracciones del tensor. El desarrollo parece haberse ralentizado hace bastante tiempo, pero tal vez eso se deba a que la biblioteca hace lo que hace y no es necesario hacer muchos cambios.


Eigen es una biblioteca de plantillas para álgebra lineal (matrices, vectores ...). Es solo encabezado y de uso gratuito (LGPL).


DyND está diseñado para ser, entre otras cosas, una biblioteca similar a NumPy para C ++. Las cosas como la radiodifusión, los operadores aritméticos y la segmentación funcionan bien. Por otro lado, todavía es muy experimental y muchas características aún no se han implementado.

Aquí hay una implementación simple del algoritmo de Casteljau en C ++ usando arrays DyND:

#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()<(e-i-1)) + t * a(0<irange()); } return a; } int main(){ nd::array a = {1., 2., 2., -1.}; std::cout << decasteljau(a, .25) << std::endl; }

Hace un tiempo escribí una publicación de blog con más ejemplos y comparaciones de la sintaxis de Fortran 90, DyND en C ++ y NumPy en Python.

Descargo de responsabilidad: Soy uno de los desarrolladores actuales de DyND.