Esta es una respuesta tarde tardía, pero sigue siendo una pregunta interesante!
La respuesta de dom es bastante precisa, y la referencia de montón/pila en user1460044 también es interesante.
Desde un punto de vista práctico, yo no usaríaMatx
(o Vec
), excepto si fuera completamente necesario. Las principales ventajas de Matx son
- Uso de la pila (eficiente! [1])
- inicialización.
El problema es que, al final, tendrá que mover sus datos a un Matx
Mat
hacer la mayoría de las cosas, y por lo tanto, se le de vuelta a la pila de nuevo. Por otro lado, la "inicialización fresco" de un Matx
se puede hacer en una estera de lo normal:
// Matx initialization:
Matx31f A(1.f,2.f,3.f);
// Mat initialization:
Mat B = (Mat_<float>(3,1) << 1.f, 2.f, 3.f);
Además, hay una diferencia en la inicialización (más allá de la pila pila /) cosas. Si intenta poner 5 valores en el Matx31, se bloqueará (excepción de tiempo de ejecución), mientras que al llamar al Mat_::operator<<
con 5 valores solo se almacenarán los tres primeros.
[1] Eficiente si su programa tiene que crear muchas matrices de menos de ~ 10 elementos. En ese caso, use matrices Matx
.
Sin mirar demasiado de cerca en la documentación, se puede decir que conocer el tamaño en tiempo de compilación tiene sin duda muchas ventajas, en primer lugar la sustitución de memoria asignada dinámicamente por las matrices de tiempo de compilación, que para este tipo de matrices pequeñas claramente definidos es una optimización obvia Dicho esto, su pregunta responde con bastante claridad: * "destinado a matrices pequeñas de tamaño conocido" *. Piense en las matrices de transformación utilizadas en las transformaciones de imagen o la calibración de la cámara. –
Pero eso todavía se puede hacer con el viejo tipo Mat al poner Mat (3,1, CV_32FC1) –
Claro, por lo tanto, todo mi primer párrafo sobre la optimización obvia de usar matrices de compilación sobre la asignación de memoria dinámica. Por supuesto, es solo una optimización y ninguna funcionalidad adicional, pero esta es exactamente la ventaja que obtienes. Realmente no desea asignar dinámicamente memoria para una matriz estricta de 3x4. –