2009-04-21 10 views
7

Mi piacerebbe eseguire funzioni a livello di elemento su tipi matrice e vettoriale, ad es. prendi il logaritmo di ogni elemento, esponenzia ogni elemento, applica funzioni speciali, come gamma e digamma, ecc. (simile al trattamento matlab di queste funzioni applicate a matrici e vettori)operazioni a livello di elemento con boost C++ tipi di matrice e vettore ublas

suppongo di scrivere una funzione di supporto che bruta -applicato questo per ogni funzione desiderata sarebbe sufficiente, ma questo sembra uno spreco.

allo stesso modo, il wiki di boost offre un codice a vectorize standard functions, ma questo sembra abbastanza complesso.

valarray è stato suggerito, ma vorrei evitare la conversione tra tipi di dati, come i need tipi uBLAS dati per altre operazioni (prodotti matrici, matrici sparse, etc.)

ogni aiuto è molto apprezzato .

risposta

9

L'utilizzo di begin1()/end1() non funziona perché fornisce l'accesso all'elemento nella posizione di colonna predefinita (0): di conseguenza, è sufficiente accedere a tutti gli elementi nella prima colonna. E 'meglio (nel senso che si ottiene il comportamento previsto) per ottenere l'accesso sequenziale tramite:

std::transform(mat.data().begin(), mat.data().end(), 
       mat.data().begin(), boost::math::tgamma) ; 

Ho il sospetto che questo può essere un caso in cui l'implementazione non è abbastanza completo.

Divertiti!

Problemi correlati