求大神,c语言的一个矩阵相乘(两个3*3的矩阵),中值滤波问题

基本思路我已经知道了:
160 163 167 159 158 155 153 155 157和Mask每一项相乘相加再除以16等于 (160*1+163*2+167*1+159*2+158*4+155*2+153*1+155*2+157*1)/16结果是158.3125所有的元素都这么计算。
现在希望有个完整的C语言源代码,解决了追加!!
期末报告,后天就要交了,急急,在线等,望各位大神解小女子一惑。

按照题目要求写如下代码,后面附结果,如果满意,望采纳!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double A[3][16] = {160,163,167,80,83,85,155,158,159,20,22,23,170,173,176,179,
   159,158,155,75,78,80,156,159,153,25,23,21,167,168,166,164,
   153,155,157,81,84,82,154,153,158,27,25,24,168,172,171,170}; 

double mask[3][3] = {1,2,1,
 2,4,2,
 1,2,1};

void myfilter(double* p)
{
int i,j;
for (i = 1; i <= 14; ++i)
{
/* code */
double sum = 0;
for(j=0;j<3;++j)
{
sum += A[j][i-1]*mask[j][0] + A[j][i]*mask[j][1] + A[j][i+1]*mask[j][2];
}
// printf("sum=%lf\n", sum);
*p++ = sum/16;
}
return;
}

int main(int argc, char const *argv[])
{
/* code */
double ans[14];
double * p = ans;
myfilter(p);
int i;
for(i=0;i<14;++i)
{
printf("%.4lf\n", ans[i]);
}
printf("\n");
system("pause");
return 0;
}

追问

谢谢,同时想请问一下怎样使最后输出时是一个整数?
%.4lf中的.4是什么意思啊?这句*p++ = sum/16;是在哪个for循环后面运行的呀,还是说两个for循环结束后再运行?为什么要++的?

追答计算的时候用的是double,如果要输出整型的话,需要转换为整型,比如答案
for(i=0;i<14;++i)
{
    printf("%d\n",(int)floor(ans[i]+0.5));//floor()向下取整,+0.5实现四舍五入
}
%.4lf中4是输出小数精度为4位
*p++ 当然是在外层for里面,内存for外面运行的
++是为了移动指针位置,从而将每次运算的结果保存到数组ans的对应单元里,相当于直接传入数组ans,然后那一句替换为: ans[i-1] = sum/16;  注意下标是从0开始的

追问

可是改成 ans[i-1] = sum/16 ,ans数组不是还没有申明吗,不能使用的呀?此外大神你用的是6.0吗,有的我在vs2010都运行不了啊~~

追答我只是说相当于,如果你真要改的话,肯定要把ans数组声明在前面或者作为参数传到函数myfilter里面
我用的GCC
VC6.0是刚试过也可以运行的啊
不能运行是什么错误,你贴出来看看。

追问

噢,木有事了,是我自己的粘贴失误,真的很感谢你那么认真的回答,谢谢你^@^

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答