2011-12-16 5 views

risposta

29

Un lambda dovrebbe fare il trucco:

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

Ancora meglio, grazie a @Pavel e interamente C++ 98:

#include <functional> 

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

Dannazione, ho completamente dimenticato la versione a doppio input! – Xeo

+0

+1 fantastico! Sembra che questa soluzione produrrà comunque un risultato fintanto che b è almeno lunga come una, corretta? – kfmfe04

+0

@ kfmfe04: corretto. Avanzi i passi 'b.begin()' 'a.end() - a.begin()'. – Xeo

1

Se avete intenzione di fare questo un sacco , su grandi matrici, controlla le librerie di algebra lineare menzionate in https://stackoverflow.com/search?q=valarray. Molti di loro trarranno vantaggio da istruzioni speciali per ottenere la risposta più velocemente.

+1

Sfortunatamente questo è un problema di qualità dell'implementazione e la maggior parte delle implementazioni C++ che ho visto non cercano veramente di ottimizzare il valarray. L'unico che conosco lo ottimizza effettivamente per l'utilizzo di opcode vettoriali CPU e tale è Intel C++. –

+0

@Jeffrey +1 interessante: è inteso a sostituire BLAS? – kfmfe04

+0

@ kfmfe04 Altrimenti. valarray è l'idea generale, ma risale al 1998, e altre librerie di algebra lineare come uBLAS (http://www.boost.org/libs/numeric/ublas/doc/index.htm) tendono ad essere migliori. Nelle domande menzionate nella ricerca a cui mi sono collegato, la gente suggerisce diverse altre librerie. –

0

Solo un'idea, non specifica del linguaggio C++ 11: forse è possibile passare attraverso gli array 8 byte alla volta usando uint_64, anche se l'array effettivo è composto da numeri interi a 32 bit? Quindi non ti affidi ad es. SSE, ma ottiene comunque un'esecuzione rapida su molte CPU con registri a 64 bit di larghezza.

Problemi correlati