opencv计算矩阵与数值的乘积,矩阵与矩阵的乘积 古城微笑少年丶 2022-08-27 14:43 117阅读 0赞 1、矩阵与数值的乘积 在进行数组与一个常量相乘的运算时,使用了Mat类中的mul函数。 //! per-element matrix multiplication by means of matrix expressions MatExpr mul(InputArray m, double scale=1) const; 使用后,发现数据有些异常,于是就打印出每一个计算后的数值, 发现原来该函数是将,m中矩阵每个元素先做二次方运算,再与scale相乘,于是放弃用该函数,改用 //! computes element-wise weighted product of the two arrays (dst = scale*src1*src2) CV_EXPORTS_W void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1); 在使用时,先设置 Mat src2 = Mat::ones(src1.rows, src1.cols, src1.type()); 然后再进行src1与scale的相乘运算: multiply(src1, src2, IResult, scale); 2、矩阵与矩阵的乘积 C(m\*k) = A(m\*n) \* B(n\*k) 计算上述运算时,就不能用 <pre name="code" class="cpp">multiply(src1, src2, IResult, scale); 这个函数来计算了,因为这个函数只适用于计算两个大小相同的矩阵的对应点的乘积。 所以采用gemm()函数来计算: //! implements generalized matrix product algorithm GEMM from BLAS CV_EXPORTS_W void gemm(InputArray src1, InputArray src2, double alpha, InputArray src3, double gamma, OutputArray dst, int flags=0); 使用时注意flags的含义:默认是0,表示输入的矩阵都不转置。 dst = alpha\* src1 \*src2 + gamma\* src3 如果要对某个输入的矩阵进行转置,可进行如下设置: flags – operation flags: GEMM\_1\_T transposes src1. GEMM\_2\_T transposes src2. GEMM\_3\_T transposes src3.
还没有评论,来说两句吧...