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

#contents

*乗算 [#g76d8fb6]

通常の掛け算

#mimetex(\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); [#a7bd017c]
オペレータ
***引数 [#af14ebb6]
-a,b:Matクラス型の行列.
***返り値 [#e1e90408]
-MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.
**MatExpr Mat::mul(Mat& m, double scale); [#uc7683aa]
行列のオペレータ
***引数 [#l36f60d1]
-a:Matクラス型の行列.本当はInputArray型
-scale:double型のスケール係数
***返り値 [#c46e5a3d]
-MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.

**void gemm( Mat& a, Mat& b, double alpha, Mat& c, double beta, Mat& dst, int flags ); [#sbfbbd22]
***引数 [#d4724afa]
-a,b,c:Matクラス型の行列.
-alpha, beta:スケール係数
-flags:int型の転置行列を表すフラグ
***返り値 [#z865dfe7]
-void型なのでなし

**void cvMatMul( CvMat* src1, CvMat* src2, CvMat* dst); [#we1a33e5]
**void cvMatMulAdd( CvMat* src1, CvMat* src2, CvMat* src3, CvMat* dst); [#g329deb2]
**void cvGEMM( CvMat* src1, CvMat* src2, double alpha, CvMat* src3, double beta, CvMat* dst, int flags ); [#oa59c3e6]

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

***引数 [#j5c30562]
-src1, src2, src3:CvMat*型の行列
-dst:CvMat*型の出力行列
-alpha, beta:スケーリング係数
***返り値 [#qdcb5eb3]
-void型なのでなし

*内積 [#g750aa78]
#mimetex(\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 ); [#q6803ca9]
***引数 [#mcd7c279]
-a:Matクラス型のベクトル
***返り値 [#t6d64a45]
-double型の内積の値.自クラスの値との内積の値を返す.
**double cvDotProduct( CvMat* a, CvMat* b ); [#f61c2ec7]
***引数 [#o9feeb59]
-a,b:CvMat*型のベクトル
***返り値 [#s4a26642]
-double型の内積の値.自クラスの値との内積の値を返す.

*外積 [#l3875b36]
#mimetex(\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 ); [#u603d1fa]
***引数 [#hee0ef40]
-a:Matクラス型のベクトル
***返り値 [#na115d7c]
-void型なのでなし
**void cvCrossProduct( CvMat* src1, CvMat* src2, CvMat* dst ); [#m27450b3]
***引数 [#s9acd17d]
-src1,src2:CvMat*型のベクトル
-dst:CvMat*型のベクトル(計算結果)
***返り値 [#y976d30c]
-void型なのでなし

*要素ごとの乗算 [#r4ec677f]
#mimetex(\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 ); [#g1439ecf]
***引数 [#uc697d06]
-a:Matクラス型のベクトル/行列
***返り値 [#b44e76d4]
-MatExpr型の乗算結果.MatExpr型はとりあえずMat型と思っていて良い.
**void cvMul( CvMat* a, CvMat* b, CvMat* dst, double scale ); [#s4681c35]
***引数 [#h1018126]
-a, b:CvMat*型のベクトル/行列
-dst:CvMat*型の計算結果ベクトル/行列
***返り値 [#z2ff8024]
-void型なのでなし

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

*サンプルコード [#r1296b97]
TBW
//geshi(c++,number){{
// //サンプルコードはこのようにボックスにして記述.
// //行頭に半角スペースを入れた行を連続させることによって可能.
// IplImage* input = cvCreateImage( cvSize( 320, 240), IPL_DEPTH_8U, 1);
// cvReleaseImage( &input);
// //cvReleaseImageはIplImage**型が引数.IplImage*型ではない
// //なるべくコメントを多く残すこと
// //この項は省略可
// }}


*実体ファイル [#r780c98f]
-[[: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