Quello che vorrei fare è essenzialmente implementare questa funzione:Crea un Eigen Matrix da una matrice C
template<typename T>
Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols);
senza copiare i dati. So che il modo standard per realizzare qualcosa di simile è con una mappa, ma ho diversi problemi con questo approccio.
Non voglio riscrivere il resto del mio codice di accettare Maps come ingressi (senza copiare il Map in una matrice temporanea, che è). So che potrei fare questo generalizzando le mie funzioni per prendere gli oggetti MatrixBase come input, ma ho definito specifici modelli Matrix nei miei input per un motivo - se la mia funzione prende uno
Matrix<T, Dynamic, Dynamic, ColMajor>
, allora è perché dovrebbero essere usate solo matrici di quel tipo come input.Idealmente, mi piacerebbe che la matrice creata prendesse possesso del puntatore dati, quindi posso semplicemente gestire Matrix tramite shared_ptr e non dover toccare nuovamente il puntatore dati originale.
Il mio pensiero iniziale era che avrei potuto fare qualcosa di simile a creare un oggetto Matrix non inizializzato dimensioni in modo dinamico, e poi basta impostare le dimensioni ed i dati puntatore dell'oggetto, ma questo non sembra essere possibile in API Eigen. Qualcuno sa di eventuali soluzioni alternative?
La tua brutta soluzione sembra essere la soluzione più semplice, ma non è abbastanza pericolosa? Al momento non sono troppo preoccupato del fatto che il codice compilato sia portatile, ma c'è qualche garanzia per Foo e un MatrixX basato su modelli finirebbe con la stessa disposizione in memoria? Per quanto riguarda la seconda opzione, suona come ho potuto riscrivere i miei metodi per cercare qualcosa di simile: modello vuoto Foo (const Rif >) e questo li permetterebbe accettare gli input di Matrix e Map >? –
user2452966
Il layout della memoria è garantito (compatibilità ABI su tutte le versioni di Eigen). Per Ref <> sì, ecco come usarlo.Il problema è che è meno conveniente quando è parzialmente definito con il parametro template, in quanto Matrix o Map non ereditano Ref <> e quindi al compilatore non sarà consentito istanziare implicitamente gli argomenti del template giusti. Quindi devi fornirlo esplicitamente, o fare esplicitamente la conversione in Ref <>, o se sei preoccupato solo di 2 o 3 tipi di scalari, puoi anche fare in modo che i sovraccarichi 2-3 chiamino la versione generica (soluzione più pulita). – ggael