求大神,c语言的一个矩阵相乘(两个3*3的矩阵),中值滤波问题
基本思路我已经知道了:160163167159158155153155157和Mask每一项相乘相加再除以16等于(160*1+163*2+167*1+159*2+158...
基本思路我已经知道了:
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语言源代码,解决了追加!!
期末报告,后天就要交了,急急,在线等,望各位大神解小女子一惑。 展开
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语言源代码,解决了追加!!
期末报告,后天就要交了,急急,在线等,望各位大神解小女子一惑。 展开
1个回答
展开全部
按照题目要求写如下代码,后面附结果,如果满意,望采纳!
#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开始的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询