2011-12-16 10 views

Respuesta

29

Un lambda debe hacer el truco:

#include <algorithm> 
#include <iterator> 

std::transform(a.begin(), a.end(),  // first 
       b.begin(),    // second 
       std::back_inserter(c), // output 
       [](uint32_t n, uint32_t m) { return n & m; }); 

Aún mejor, gracias a @Pavel y totalmente C++ 98:

#include <functional> 

std::transform(a.begin(), a.end(), b.begin(), 
       std::back_inserter(c), std::bit_and<uint32_t>()); 
+0

Maldición, ¡olvidé por completo la versión de doble entrada! – Xeo

+0

+1 ¡fantástico! Esta solución parece que todavía producirá un resultado siempre que b sea al menos tan larga como a, ¿correcto? – kfmfe04

+0

@ kfmfe04: Correcto. Avanzará en los pasos 'b.begin()' 'a.end() - a.begin()'. – Xeo

1

Si usted va a estar haciendo esto mucho , en matrices grandes, consulte las bibliotecas de álgebra lineal mencionadas en https://stackoverflow.com/search?q=valarray. Muchos de ellos aprovecharán las instrucciones especiales para obtener la respuesta más rápido.

+1

Desafortunadamente este es un problema de calidad de implementación, y la mayoría de las implementaciones de C++ que he visto realmente no intentan optimizar valarray. El único que sé que en realidad lo optimiza para usar códigos de operación de vector de CPU y tal es Intel C++. –

+0

@Jeffrey +1 interesante: ¿está destinado a reemplazar a BLAS? – kfmfe04

+0

@ kfmfe04 Otra manera. valarray es la idea general, pero data de 1998, y otras bibliotecas de álgebra lineal como uBLAS (http://www.boost.org/libs/numeric/ublas/doc/index.htm) tienden a ser mejores. En las preguntas mencionadas en la búsqueda a la que me he vinculado, la gente sugiere varias otras bibliotecas. –

0

Solo una idea, no C++ 11 específica: ¿Tal vez podría recorrer los arreglos de 8 bytes a la vez usando uint_64, aunque la matriz real esté compuesta por enteros de 32 bits? Entonces no confiarías en, por ejemplo, SSE, pero aun así obtener una ejecución rápida en muchas CPU que tienen registros de 64 bits de ancho.

Cuestiones relacionadas