Questa è una risposta tardiva, ma è comunque una domanda interessante!
La risposta di dom è abbastanza accurata e anche il riferimento heap/stack in user1460044 è interessante.
Da un punto di vista pratico, non usereiMatx
(o Vec
), a meno che non erano completamente necessario. I principali vantaggi di MATX sono
- Uso della pila (efficiente [1])
- inizializzazione.
Il problema è che alla fine si dovrà spostare i dati ad un Matx
Mat
a fare la maggior parte delle cose, e così, si sarà di nuovo il mucchio di nuovo. D'altra parte, il "di inizializzazione cool" di un Matx
può essere fatto in una stuoia normale:
// Matx initialization:
Matx31f A(1.f,2.f,3.f);
// Mat initialization:
Mat B = (Mat_<float>(3,1) << 1.f, 2.f, 3.f);
Inoltre, v'è una differenza di inizializzazione (al di là del/pila heap) roba. Se si tenta di inserire 5 valori in Matx31, si bloccherà (eccezione di runtime), mentre chiamando lo Mat_::operator<<
con 5 valori verranno memorizzati solo i primi tre.
[1] Efficiente se il programma deve creare molte matrici con meno di ~ 10 elementi. In tal caso, utilizzare le matrici Matx
.
fonte
2014-07-16 13:24:34
Senza guardare troppo strettamente nella documentazione, si può dire che conoscere le dimensioni in fase di compilazione ha sicuramente molti vantaggi, primo fra tutti la sostituzione di memoria allocata dinamicamente array fase di compilazione, che per tali piccole matrici chiaramente definiti è un'ovvia ottimizzazione. Detto questo, la tua domanda risponde abbastanza chiaramente: * "destinato a piccole matrici di dimensioni note" *. Pensa alle matrici di trasformazione utilizzate nelle trasformazioni di immagine o nella calibrazione della videocamera. –
Ma questo può ancora essere fatto con il vecchio tipo Mat mettendo Mat (3,1, CV_32FC1) –
Sure, quindi tutto il mio primo paragrafo sull'ovvia ottimizzazione dell'uso di array di tempo di compilazione rispetto all'allocazione dinamica della memoria. Ovviamente è solo un'ottimizzazione e nessuna funzionalità aggiuntiva, ma esattamente questo è il vantaggio che ottieni. Non si desidera realmente allocare dinamicamente memoria per una matrice 3x4 rigorosa. –