OpenCV中Mat矩阵相乘
作者:三味书屋 来源: 2022/2/22 9:03:54

1、A*B

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

如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵

如上图所示,C=AB。C中第i行第j列所在元素C(i,j)等于A中第i行所有元素跟B中第j列所有元素一一对应的乘积之和


#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat A = Mat::ones(2, 3, CV_32FC1);
	Mat B = Mat::ones(3, 2, CV_32FC1);
	Mat AB;

	A.at<float>(0, 0) = 1;
	A.at<float>(0, 1) = 2;
	A.at<float>(0, 2) = 3;
	A.at<float>(1, 0) = 4;
	A.at<float>(1, 1) = 5;
	A.at<float>(1, 2) = 6;

	B.at<float>(0, 0) = 1;
	B.at<float>(0, 1) = 2;
	B.at<float>(1, 0) = 3;
	B.at<float>(1, 1) = 4;
	B.at<float>(2, 0) = 5;
	B.at<float>(2, 1) = 6;

	AB = A * B;

	cout << "A=\n" << A << endl << endl;
	cout << "B=\n" << B << endl << endl;
	cout << "AB=\n" << AB << endl << endl;

	system("pause");
}

2、A.dot(B)

    double dot(InputArray m) const;

A.dot(B)操作相当于数学向量运算中的点乘,也叫向量的内积、数量积。

对于向量a和向量b:


a和b的点积公式为:



对两个向量对应位一相乘之后求和的操作,点乘的结果是一个标量。

dot方法声明中显示返回值是double,所以A.dot(B)结果是一个double类型数据,不是Mat矩阵,不能把A.dot(B)结果赋值给Mat矩阵

#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat A = Mat::ones(2, 3, CV_8UC1);
	Mat B = Mat::ones(2, 3, CV_8UC1);

	A.at<uchar>(0, 0) = 1;
	A.at<uchar>(0, 1) = 2;
	A.at<uchar>(0, 2) = 3;
	A.at<uchar>(1, 0) = 4;
	A.at<uchar>(1, 1) = 5;
	A.at<uchar>(1, 2) = 6;

	B.at<uchar>(0, 0) = 1;
	B.at<uchar>(0, 1) = 2;
	B.at<uchar>(0, 2) = 3;
	B.at<uchar>(1, 0) = 4;
	B.at<uchar>(1, 1) = 5;
	B.at<uchar>(1, 2) = 6;

	double AB = A.dot(B);

	cout << "A=\n" << A << endl << endl;
	cout << "B=\n" << B << endl << endl;
	cout << "double类型的AB=\n" << AB << endl << endl;

	system("pause");
}

3、A.mul(B)

MatExpr mul(InputArray m, double scale=1) const;

要求参与运算的矩阵A的行列和B的行列数一致。计算结果是跟A或B行列数一致的一个Mat矩阵。

2*2大小的Mat矩阵A和B:

对A和B执行mul运算:


#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	Mat A = Mat::ones(2, 3, CV_8UC1);
	Mat B = Mat::ones(2, 3, CV_8UC1);

	A.at<uchar>(0, 0) = 60;
	A.at<uchar>(0, 1) = 2;
	A.at<uchar>(0, 2) = 3;
	A.at<uchar>(1, 0) = 4;
	A.at<uchar>(1, 1) = 5;
	A.at<uchar>(1, 2) = 6;

	B.at<uchar>(0, 0) = 60;
	B.at<uchar>(0, 1) = 2;
	B.at<uchar>(0, 2) = 3;
	B.at<uchar>(1, 0) = 4;
	B.at<uchar>(1, 1) = 5;
	B.at<uchar>(1, 2) = 6;

	Mat AB = A.mul(B);

	cout << "A=\n" << A << endl << endl;
	cout << "B=\n" << B << endl << endl;
	cout << "AB=\n" << AB << endl << endl;

	system("pause");
}


称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1