行列の乗算,内積,外積,要素ごとの乗算

乗算

通常の掛け算

\Large A=\large\left(\begin{array}{cc}a_{11}&a_{12}\\a_{21}&a_{22}\end{array}\right),\quad \Large B=\large\left(\begin{array}{cc}b_{11}&b_{12}\\b_{21}&b_{22}\end{array}\right)\\\Large A*B=\large\left(\begin{array}{cc}a_{11}b_{11}+a_{12}b_{21}&a_{11}b_{12}+a_{12}b_{22}\\a_{21}b_{11}+a_{22}b_{21}&a_{21}b_{12}+a_{22}b_{22}\end{array}\right)

MatExpr operator * (Mat& a, Mat& b);

オペレータ

引数

  • a,b:Matクラス型の行列.

返り値

  • MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.

MatExpr Mat::mul(Mat& m, double scale);

行列のオペレータ

引数

  • a:Matクラス型の行列.本当はInputArray型
  • scale:double型のスケール係数

返り値

  • MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.

void gemm( Mat& a, Mat& b, double alpha, Mat& c, double beta, Mat& dst, int flags );

引数

  • a,b,c:Matクラス型の行列.
  • alpha, beta:スケール係数
  • flags:int型の転置行列を表すフラグ

返り値

  • void型なのでなし

void cvMatMul( CvMat* src1, CvMat* src2, CvMat* dst);

void cvMatMulAdd( CvMat* src1, CvMat* src2, CvMat* src3, CvMat* dst);

void cvGEMM( CvMat* src1, CvMat* src2, double alpha, CvMat* src3, double beta, CvMat* dst, int flags );

cvMatMul も cvMatMulAdd も cvGEMM の別名で,cvGEMM も内部では cv::gemm を呼んでいる.

引数

  • src1, src2, src3:CvMat*型の行列
  • dst:CvMat*型の出力行列
  • alpha, beta:スケーリング係数

返り値

  • void型なのでなし

内積

\Large A=\large\left(\begin{array}{c}a_1\\a_2\\a_3\end{array}\right), \Large B=\large\left(\begin{array}{c}b_1\\b_2\\b_3\end{array}\right)\\\Large A^{\top}\cdot B=\large\left(a_1b_1+a_2b_2+a_3b_3\right)

ベクトル同士の類似度を計算したい場合に使ったりする

double Mat::dot( Mat a );

引数

  • a:Matクラス型のベクトル

返り値

  • double型の内積の値.自クラスの値との内積の値を返す.

double cvDotProduct( CvMat* a, CvMat* b );

引数

  • a,b:CvMat*型のベクトル

返り値

  • double型の内積の値.自クラスの値との内積の値を返す.

外積

\Large A=\large\left(\begin{array}{c}a_1\\a_2\\a_3\end{array}\right), \Large B=\large\left(\begin{array}{c}b_1\\b_2\\b_3\end{array}\right)\\\Large A\times B=\large\left(\begin{array}{ccc}a_2b_3-a_3b_2&a_3b_1-a_1b_3&a_1b_2-a_2b_1\end{array}\right)

3次元のベクトル同士を回転させる変換

MatExpr Mat::cross( Mat a );

引数

  • a:Matクラス型のベクトル

返り値

  • void型なのでなし

void cvCrossProduct( CvMat* src1, CvMat* src2, CvMat* dst );

引数

  • src1,src2:CvMat*型のベクトル
  • dst:CvMat*型のベクトル(計算結果)

返り値

  • void型なのでなし

要素ごとの乗算

\Large A=\large\left(\begin{array}{cc}a_{11}&a_{12}\\a_{21}&a_{22}\end{array}\right),\quad \Large B=\large\left(\begin{array}{cc}b_{11}&b_{12}\\b_{21}&b_{22}\end{array}\right)\\\Large A.\mathrm{mul}(B)=\large\left(\begin{array}{cc}a_{11}b_{11}&a_{12}b_{12}\\a_{21}b_{21}&a_{22}b_{22}\end{array}\right)

MatExpr Mat::mul( Mat a );

引数

  • a:Matクラス型のベクトル/行列

返り値

  • MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.

void cvMul( CvMat* a, CvMat* b, CvMat* dst, double scale );

引数

  • a, b:CvMat*型のベクトル/行列
  • dst:CvMat*型の計算結果ベクトル/行列

返り値

  • void型なのでなし

解説

  • OpenCV 2.3?あたりからVecやMatやPointを全て一元的に扱えるようにInputArray型というのが導入された.
  • また結果がMatExpr型というのに統一されている.
  • とりあえず全部Matと思っておけば使うのには支障ない.

サンプルコード

TBW

実体ファイル

  • :OpenCV 1.1以前
    • cxcore/include/cxcore.h
    • cxcore/src/cxmatmul.cpp
  • :OpenCV 2.3以降
    • modules/core/include/opencv2/core/mat.hpp
    • modules/core/include/opencv2/core/core_c.h
    • modules/core/src/matop.cpp (C++版)
    • modules/core/src/matrix.cpp (C版)

ジャンル:OpenCV:OpenCV 1.0:OpenCV 1.1:OpenCV 2.3:OpenCV 2.4準拠


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-09-06 (木) 10:06:12 (1905d)