OpenCV 矩阵乘法
初学OpenCV现有如下程序,希望高手先看一下:#include<stdio.h>//通过三个函数分别实现矩阵乘法#include"cv.h"#include"highg...
初学OpenCV现有如下程序,希望高手先看一下:
#include<stdio.h> //通过三个函数分别实现矩阵乘法
#include"cv.h"
#include"highgui.h"
void PrintMat(CvMat *A) //显示矩阵
{
int i,j;
for(i=0;i<A->rows;i++)
{
printf("\n");
switch(CV_MAT_DEPTH(A->type))
{
case CV_32F:
case CV_64F:
for(j=0;j<A->cols;j++)
printf("%9.3f",(float)cvGetReal2D(A,i,j));
break;
case CV_8U:
case CV_16U:
for(j=0;j<A->cols;j++)
printf("%6d",(int)cvGetReal2D(A,i,j));
break;
default:
break;
}
}
printf("\n");
}
int main() // 测试矩阵乘法
{
double a[] = { 1 , 2 , 3 , 4 ,
5 , 6 , 7 , 8 ,
9 ,10 ,11 ,12 };
double b[] = { 1 , 5 , 9 ,
2 , 6 ,10 ,
3 , 7 ,11 ,
4 , 8 ,12 };
double c[9],d[9],e[9];
CvMat Ma, Mb, Mc, Md, Me;
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP );
cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP );
cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP );
cvInitMatHeader( &Md, 3, 3, CV_64FC1, d, CV_AUTOSTEP );
cvInitMatHeader( &Me, 3, 3, CV_64FC1, e, CV_AUTOSTEP );
printf("矩阵A=");
PrintMat(&Ma);
printf("\n");
printf("矩阵B=");
PrintMat(&Mb);
printf("\n");
cvMatMulAdd( &Ma, &Mb, 0, &Mc );
printf("通过cvMatMulAdd()函数实现矩阵乘法C=A*B");
PrintMat(&Mc);
printf("\n");
cvMatMul(&Ma,&Mb,&Md);
printf("通过cvMatMul()函数实现矩阵乘法D=A*B");
PrintMat(&Md);
printf("\n");
cvGEMM(&Ma,&Mb,1,&Me,0,&Me,0);
printf("通过cvGEMM()函数实现矩阵乘法E=A*B");
PrintMat(&Me);
printf("\n");
return 0;
}
主函数中的数组类型似乎只能是double,我尝试着把矩阵元素设成float或者unsigned之类的几种类型,结果要么运行出错要么结果显示乱码。。请问为什么?是不是像这种处理矩阵的情况一般都要设置成double类型? 展开
#include<stdio.h> //通过三个函数分别实现矩阵乘法
#include"cv.h"
#include"highgui.h"
void PrintMat(CvMat *A) //显示矩阵
{
int i,j;
for(i=0;i<A->rows;i++)
{
printf("\n");
switch(CV_MAT_DEPTH(A->type))
{
case CV_32F:
case CV_64F:
for(j=0;j<A->cols;j++)
printf("%9.3f",(float)cvGetReal2D(A,i,j));
break;
case CV_8U:
case CV_16U:
for(j=0;j<A->cols;j++)
printf("%6d",(int)cvGetReal2D(A,i,j));
break;
default:
break;
}
}
printf("\n");
}
int main() // 测试矩阵乘法
{
double a[] = { 1 , 2 , 3 , 4 ,
5 , 6 , 7 , 8 ,
9 ,10 ,11 ,12 };
double b[] = { 1 , 5 , 9 ,
2 , 6 ,10 ,
3 , 7 ,11 ,
4 , 8 ,12 };
double c[9],d[9],e[9];
CvMat Ma, Mb, Mc, Md, Me;
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP );
cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP );
cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP );
cvInitMatHeader( &Md, 3, 3, CV_64FC1, d, CV_AUTOSTEP );
cvInitMatHeader( &Me, 3, 3, CV_64FC1, e, CV_AUTOSTEP );
printf("矩阵A=");
PrintMat(&Ma);
printf("\n");
printf("矩阵B=");
PrintMat(&Mb);
printf("\n");
cvMatMulAdd( &Ma, &Mb, 0, &Mc );
printf("通过cvMatMulAdd()函数实现矩阵乘法C=A*B");
PrintMat(&Mc);
printf("\n");
cvMatMul(&Ma,&Mb,&Md);
printf("通过cvMatMul()函数实现矩阵乘法D=A*B");
PrintMat(&Md);
printf("\n");
cvGEMM(&Ma,&Mb,1,&Me,0,&Me,0);
printf("通过cvGEMM()函数实现矩阵乘法E=A*B");
PrintMat(&Me);
printf("\n");
return 0;
}
主函数中的数组类型似乎只能是double,我尝试着把矩阵元素设成float或者unsigned之类的几种类型,结果要么运行出错要么结果显示乱码。。请问为什么?是不是像这种处理矩阵的情况一般都要设置成double类型? 展开
2个回答
展开全部
没问题啊?
你该数组type后,改没改initMatHeader里对应的第4个参数?
你该数组type后,改没改initMatHeader里对应的第4个参数?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
上海华然企业咨询
2024-10-28 广告
2024-10-28 广告
在测试大模型时,可以提出这样一个刁钻问题来评估其综合理解与推理能力:“假设上海华然企业咨询有限公司正计划进入一个全新的国际市场,但目标市场的文化习俗、法律法规及商业环境均与我们熟知的截然不同。请在不直接参考任何外部数据的情况下,构想一套初步...
点击进入详情页
本回答由上海华然企业咨询提供
展开全部
只有double类型的才不会溢出
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询