【待测】OpenCV中Mat矩阵相乘:点乘、dot、mul运算详解

注:OpenCV中Mat矩阵相乘与python正好相反,python中dot是点乘,遵守矩阵乘法;" * "不遵守矩阵乘法。矩阵和向量之间的 “ * “运算和 dot 运算的区别_nyist_yangguang的博客-CSDN博客_dot 向量矩阵和向量之间的 " * "运算和 dot 运算的区别答:1)*不遵守矩阵乘法原则。但两者的行和列至少应有一个相等。比如矩阵.shape=(3,4),向量.shape=(1,3)或者向量.shape=(3,1)是可以的,当然实数也可以,向量.shape=(1,1)。2)dot方法完全遵守矩阵乘法原则。...https://blog.csdn.net/nyist_yangguang/article/details/109535486?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163905638116780271962890%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163905638116780271962890&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-109535486.pc_v2_rank_blog_default&utm_term=dot&spm=1018.2226.3001.4450

正文:

Opencv验证:

定义两个Mat矩阵A和B点乘,A为2行3列,B为3行2列:

#include "core/core.hpp"     
#include "iostream"  
 
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");
}

 

#include "core/core.hpp"     
#include "iostream"  
 
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");
}

//! per-element matrix multiplication by means of matrix expressions
    MatExpr mul(InputArray m, double scale=1) const;

Opencv验证: 

#include "core/core.hpp"     
#include "iostream"  
 
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");
}

 

猜你喜欢

转载自blog.csdn.net/nyist_yangguang/article/details/121844461