GEMM

通用矩阵乘法


void
 cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const 
CvArr* src3, double beta, CvArr* dst, int tABC=0 ); #define cvMatMulAdd(
 src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 ) 
#define cvMatMul( src1, src2, dst ) cvMatMulAdd( src1, src2, 0, dst )


第一输入数组 src2 第二输入数组 src3 第三输入数组 (偏移量),如果没有偏移量,可以为空( NULL) 。 dst 输出数组 tABC CV_GEMM_A_T - 转置 src1 CV_GEMM_B_T - 转置 src2 CV_GEMM_C_T - 转置 src3 alpha*src1T*src2 + beta*src3T

函数 cvGEMM 执行通用矩阵乘法:


dst = alpha*op(src1)*op(src2) + beta*op(src3), 这里 op(X) 是 X 或者 XT


所有的矩阵应该有相同的数据类型和协调的矩阵大小。支持实数浮点矩阵或者复数浮点矩阵。

Transform

对数组每一个元素执行矩阵变换


void cvTransform( const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL );


输入数组 dst 输出数组 transmat 变换矩阵 shiftvec 可选偏移向量

函数 cvTransform 对数组 src 每一个元素执行矩阵变换并将结果存储到 dst:


dst(I)=transmat*src(I) + shiftvec

或者


dst(I)k=sumj(transmat(k,j)*src(I)j) + shiftvec(k)

N-通道数组 src 的每一个元素都被视为一个N元向量,使用一个 M×N 的变换矩阵 transmat 和偏移向量 shiftvec 把它变换到一个 M-通道的数组 dst 的一个元素中。 这里可以选择将偏移向量 shiftvec 嵌入到 transmat 中。这样的话 transmat 应该是 M×N+1 的矩阵,并且最右边的一列被看作是偏移向量 。

输入数组和输出数组应该有相同的位深(depth)和同样的大小或者 ROI 大小。 transmat 和 shiftvec 应该是实数浮点矩阵。

该函数可以用来进行 ND 点集的几何变换,任意的线性颜色空间变换,通道转换等。

MulTransposed

计算数组和数组的转置的乘积


void cvMulTransposed( const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL );


输入矩阵 dst 目标矩阵 order 乘法顺序 delta 一个可选数组, 在乘法之前从 src 中减去该数组。

函数 cvMulTransposed 计算 src 和它的转置的乘积。

函数求值公式:

如果 order=0


dst=(src-delta)*(src-delta)T

否则


dst=(src-delta)T*(src-delta)

Trace

返回矩阵的迹


CvScalar cvTrace( const CvArr* mat );


输入矩阵

函数 cvTrace 返回矩阵mat的对角线元素的和。


tr(src) =

 

mat(i,i)

 

i

 

Transpose

矩阵的转置


void cvTranspose( const CvArr* src, CvArr* dst ); #define cvT cvTranspose


输入矩阵 dst 目标矩阵

函数 cvTranspose 对矩阵 src 求转置:


dst(i,j)=src(j,i)

注意,假设是复数矩阵不会求得复数的共轭。共轭应该是独立的:查看的 cvXorS 例子代码。

Det

返回矩阵的行列式值


double cvDet( const CvArr* mat );


输入矩阵

函数 cvDet 返回方阵 mat 的行列式值。对小矩阵直接计算,对大矩阵用 高斯(GAUSSIAN)消去法。对于对称正定(positive-determined)矩阵也可以用 SVD 函数来求,U=V=NULL ,然后用 w 的对角线元素的乘积来计算行列式。

Invert

查找矩阵的逆矩阵或伪逆矩阵


double cvInvert( const CvArr* src, CvArr* dst, int method=CV_LU ); #define cvInv cvInvert


输入矩阵 dst 目标矩阵 method CV_LU -最佳主元选取的高斯消除法 CV_SVD - 奇异值分解法 (SVD) CV_SVD_SYM - 正定对称矩阵的 SVD 方法

函数 cvInvert 对矩阵 src 求逆并将结果存储到 dst。

如果是 LU 方法该函数返回 src 的行列式值 (src 必须是方阵)。 如果是 0, 矩阵不求逆, dst 用 0 填充。

如果 SVD 方法该函数返回 src 的条件数的倒数(最小奇异值和最大奇异值的比值) ,如果 src 全为 0 则返回0。 如果 src 是奇异的, SVD 方法计算一个伪逆矩阵。

Solve

求解线性系统或者最小二乘法问题


int cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU );


输入矩阵 src2 线性系统的右部 dst 输出解答 method CV_LU - 最佳主元选取的高斯消除法 CV_SVD - 奇异值分解法 (SVD) CV_SVD_SYM - 对正定对称矩阵的 SVD 方法

函数 cvSolve 解决线性系统或者最小二乘法问题 (后者用 SVD 方法可以解决):



如果使用 CV_LU 方法。 如果 src1 是非奇异的,该函数则返回 1 ,否则返回 0 ,在后一种情况下 dst 是无效的。




SVD

对实数浮点矩阵进行奇异值分解


void cvSVD( CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int flags=0 );


M×N 的输入矩阵 W 结果奇异值矩阵 (M×N 或者 N×N) 或者 向量 (N×1). U 可选的左部正交矩阵 (M×M or M×N). 如果 CV_SVD_U_T 被指定, 应该交换上面所说的行与列的数目。 V 可选右部正交矩阵(N×N) flags

  • CV_SVD_MODIFY_A 通过操作可以修改矩阵 src1 。这样处理速度会比较快。
  • CV_SVD_U_T 意味着会返回转置矩阵 U ,指定这个标志将加快处理速度。
  • CV_SVD_V_T 意味着会返回转置矩阵 V ,指定这个标志将加快处理速度。

函数 cvSVD 将矩阵 A 分解成一个对角线矩阵和两个正交矩阵的乘积: