您的位置:首页 > 编程语言

【图像处理】矩阵运算代码实现1

2016-02-18 21:02 489 查看
这里主要实现矩阵的一些基础运算,包括转置及乘法。后续将进行矩阵求逆的总结。

由于转置及乘法都比较简单,对其原理不再赘述。

1、矩阵打印

void matPrint(double* mat, int row,int col){
for(int i=0; i<row; i++)
{
for(int j=0; j<col; j++)
printf("%2.2f ", mat[i*col+j]);
printf("\n");
}
}


2、矩阵转置

int matTrans(double *a,int ra,int ca,double *t){
if(a==NULL||t==NULL){
return 0;
}
int i,j;
for(i=0;i<ra;i++){
for(j=0;j<ca;j++){
*(t+j*ra)=*a++;
}
t++;
}
return 1;
}


3、矩阵乘法

int matMul(double *a,double *b,int ra,int ca,int rb, int cb,double *c){
if(a==NULL||b==NULL||c==NULL){
return 0;
}
if(ca!=rb){
printf("column no. of A must equal to row no. of b");
return 0;
}
int i,j,k;
double sum=0.0;
// 为了使得内存访问的方便,这里采用b的转置进行运算。当a的行与b的某一列进行卷积时,相当于a的行与bT的行进行卷积。
double *bT = (double*)malloc(sizeof(double)*rb*cb);

if(bT==NULL)
return 0;
if(!matTrans(b,rb,cb,bT)){
return 0;
}
double *bT_start=bT;
for(i=0;i<ra;i++){
for(j=0;j<cb;j++){
sum =0.0;
for(k=0;k<rb;k++){
sum+=((*(a+k)) * (*(bT+k)));
}
bT+=rb;
*c++ =sum;
}
a+=ca;
bT = bT_start;

}
free(bT);
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: