¿Matrices de estilo NumPy para C++?


Existen libs de C++ (o C) que tienen arrays tipo NumPy con soporte para dividir, operaciones vectorizadas, agregar y restar contenido elemento por elemento, etc.?

Author: Llamageddon, 2012-06-23

10 answers

Aquí hay varios software libre que pueden satisfacer sus necesidades.

  1. La GNU Scientific Library es un software GPL escrito en C. Por lo tanto, tiene una asignación similar a C y una forma de programación (punteros, etc.).). Con el GSLwrap, puede tener una forma de programación en C++, mientras todavía usa el GSL. GSL tiene una implementación BLAS, pero puede usar ATLAS en lugar de los CBLAS predeterminados, si desea aún más actuaciones.

  2. Las boost / uBLAS library es una biblioteca BSL, escrita en C++ y distribuida como un paquete boost. Es una forma C++de implementar el estándar BLAS. uBLAS viene con algunas funciones de álgebra lineal, y hay un enlace experimental a ATLAS.

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

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

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

 31
Author: nojhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 16:02:18

Prueba xtensor. (Ver la Hoja de trucos de NumPy a Xtensor).

Xtensor es una biblioteca de C++ diseñada para el análisis numérico con expresiones de matriz multidimensional.

Xtensor proporciona

  • un sistema de expresión extensible que permite la difusión al estilo numpy.
  • una API que sigue los modismos de la biblioteca estándar de C++.
  • herramientas para manipular expresiones de matriz 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}

Inicializar una matriz 1-D y remodelarla en su lugar.

#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}}
 22
Author: Quant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-03 08:39:29

DyND está diseñado para ser, entre otras cosas, una biblioteca tipo NumPy para C++. Cosas como la radiodifusión, los operadores aritméticos y el corte 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 matrices 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;
}

Escribí una entrada de blog hace un rato con más ejemplos y comparaciones lado a lado de la sintaxis para Fortran 90, DyND en C++ y NumPy en Python.

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

 7
Author: IanH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 22:14:54

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 de solo encabezado. Se basa en la plantilla con el fin de generar código bien optimizado. Vectoriza automáticamente las operaciones de la matriz.

También soporta completamente operaciones de coeficiente sabio, como la "multiplicación por elemento" entre dos matrices por ejemplo. ¿Es lo que necesitas?

 3
Author: Frédéric Terrazzoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-23 12:20:40

Blitz++ soporta arrays con un número arbitrario de ejes, mientras que Armadillo solo soporta 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 de tensor. El desarrollo parece haberse ralentizado hace bastante tiempo, pero tal vez eso es solo porque la biblioteca hace lo que hace y no es necesario realizar muchos cambios hecho.

 2
Author: Dan Stahlke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-04 13:07:10

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 me he encontrado con el uso de NumPy en términos de su API.

El principal inconveniente es que no es tan utilizado como los demás, por lo que no encontrará mucha ayuda en línea. Eso, y es torpemente nombrado (trate de buscarlo!)

 1
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-05 14:27:01

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

 0
Author: Claudio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-23 12:21:05

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

 0
Author: Matt Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-23 12:25:09

Mientras que GLM está diseñado para acoplarse fácilmente con OpenGL y GLSL, es una biblioteca matemática de cabecera totalmente funcional para C++ con un conjunto de interfaces muy intuitivo.

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

Multiplicar dos matrices es un simple as (M1 * M2). Restando dos vectores (V1-V2).

Acceder a los valores contenidos en vectores o matrices es igualmente sencillo. Después de declarar un vector vec3, por ejemplo, se puede acceder a su primer elemento con vector.x. Compruébalo.

 -1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 19:01:59

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 de compiladores. ¿Has mirado STL?

 -6
Author: CBass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-23 12:18:04