新しいデータ構造cv::Matxが新しいOpenCVバージョンに追加されたことに気付きました。これは、コンパイル時に既知のサイズの小さな行列を対象としています。たとえば、
cv::Matx31f // matrix 3x1 of float type
ドキュメンテーションを確認すると、ほとんどの行列演算が利用可能であることがわかりましたが、古い cv::Mat の代わりにこの新しい型を使用する利点はまだわかりません。
Mat の代わりに Matx を使用する必要があるのはいつですか?
新しいデータ構造cv::Matxが新しいOpenCVバージョンに追加されたことに気付きました。これは、コンパイル時に既知のサイズの小さな行列を対象としています。たとえば、
cv::Matx31f // matrix 3x1 of float type
ドキュメンテーションを確認すると、ほとんどの行列演算が利用可能であることがわかりましたが、古い cv::Mat の代わりにこの新しい型を使用する利点はまだわかりません。
Mat の代わりに Matx を使用する必要があるのはいつですか?
これはメモリ管理に関するものであり、(場合によっては重要な) メモリを浪費したり、後で使用するオブジェクトのためにメモリを予約したりすることはありません。
それが私がそれを理解している方法です-他の誰かがより良い説明をすることができるかもしれません.
これは遅い遅い答えですが、それでも興味深い質問です!
dom の回答は非常に正確であり、user1460044 のヒープ/スタック参照も興味深いものです。
実用的な観点からは、完全に必要な場合を除いて、(または)は使用しません。 Matx の主な利点は次のとおりです。MatxVec
問題は、最後にほとんどのことを行うためにMatxデータをに移動するMat必要があるため、再びヒープに戻ることです。一方、 a の「クールな初期化」はMatx通常の Mat で実行できます。
// Matx initialization:
Matx31f A(1.f,2.f,3.f);
// Mat initialization:
Mat B = (Mat_<float>(3,1) << 1.f, 2.f, 3.f);
また、(ヒープ/スタックを超えた) 初期化にも違いがあります。5 つの値を Matx31 に入れようとすると、クラッシュします (実行時例外)。一方、Mat_::operator<<5 つの値で を呼び出すと、最初の 3 つだけが保存されます。
[1]要素数が 10 以下の多数の行列をプログラムで作成する必要がある場合に効率的です。その場合、Matx行列を使用します。