比如上面h数组里面单元是5 而x数组 是4
所以肯定一点是结果是等于8个数的
result[(sizeof(h) + sizeof(x)) / sizeof(double) - 1]这个就可以说明了
第二个知识点是卷积是怎么求的。第一步肯定是判断两个数组 那个长度长
conv(x, h, sizeof(x) / sizeof(x[0]), sizeof(h) / sizeof(h[0]), result) 就是实现这个目标的。
然后是长度长的放前面
好吧 我换个 数字来就把
x【】=
h【】=
然后卷积 一个是 x0*h0=1;实现语句 是第一个
for (int i = 0i <lenHi++)
{
for (int j = 0j <= ij++)
result[i] += x[j] * h[i - j]
}
此时 已经要转入第二步骤了:
for (int m = lenHm <lenXm++){
for (int j = 0j <lenHj++)
result[m] += x[m - j] * h[j]
}
第二部 应该是 x*h+x1*h(1-1)= 这里得h1 用0代替 但程序里 不是这样 而是 用x*h=
好吧 我可能设置的h数组不够长 加入 h有两个。x有
那么 结果 应该是x2*y1+x1*y0;
然后是第三部
是说 在要求的 结果 最后几个数字时候 比如原题里面 应该是有8个的。但到第二个循环才求到X得长度5个。
所以 后面应该是resual记住 数组下标 比实际小1. 所以
是这样的
用 for (int n = lenXn <lenX + lenH - 1n++){
for (int j = i - lenX + 1j <lenHj++)
result[n] += x[n - j] * h[j]
}里面的i 要改成n
for (int n = lenXn <lenX + lenH - 1n++){
for (int j = n - lenX + 1j <lenHj++)
result[n] += x[n - j] * h[j]
}
然后 是这样分析的
结果等于=x(0)h(5-0)+x(1)h(5-1)+x(2)h(5-2)+x(3)h(5-3)=x(0)h(5)+x(1)h(4)+x(2)h(3)+x(3)h(2) 记住 数组不够的地方 用0代替
copy(result, &result[8], ostream_iterator<double>(cout, " ")) 这个函数 就不想说了 自己去看stl 算法吧
另外,虚机团上产品团购,超级便宜
卷积在工程和数学上都有很多应用:统计学中,加权的滑动平均是一种卷积。概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。物理学中,任何一个线性系统(符合叠加原理)都存在卷积。
介绍一个实际的概率学应用例子。假设需求到位时间的到达率为poisson(λ)分布,需求的大小的分布函数为D(.),则单位时间的需求量的分布函数为 F(x):
其中 D(k)(x)为k阶卷积。
卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。castlman的书对卷积讲得很详细。
高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到:
for(i=0i<Ni++)
{
for(j=0j<Nj++)
{
g[i*N+j]=exp(-((i-(N-1)/2)^2+(j-(N-1)/2)^2))/(2*delta^2))
sum += g[i*N+j]
}
}
再除以 sum 得到归一化算子
N是滤波器的大小,delta自选
首先,在提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。
信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入 输出 和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。
因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。
卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。
C++语言代码: void convolution(float *input1, float *input2, float *output, int mm, int nn){ float *xx = new float[mm+nn-1]// do convolution for (int i = 0i <mm+nn-1i++){ xx[i] = 0.0 for (int j = 0j <mmj++) { if (i-j >0 &&i-j <nn)xx[i] += input1[j] * input2[i-j]} } // set value to the output array for (int i = 0i <mmi++) output[i] = xx[i + (nn-1) / 2]delete[] xx}
卷积 需要 有两个 函数 才好计算。卷积 是 两个函数中的一个函数翻转并平移后 与 另一个函数的乘积的积分。
离散域函数卷积:(f*g)[m] = SUM (f[n] g[m-n]) (累加n=0,1,2,。。)
#include "stdio.h"
#include "math.h"
FILE *fin, *fout
float g(int mn)
{
float result=0.5
// insert function calculation
return result
}
void main()
{
char namein[60]="m1.dat",nameout[60]="m2.dat"
float x[500][5],sum // 数组大小须根据数的多少作修改。
int i,j,k,NN
if ((fin=fopen(namein,"r") )==NULL){
printf("open %s error\n",namein)exit(0)
}
if ((fout=fopen(nameout,"w") )==NULL){
printf("open %s error\n",nameout)exit(0)
}
NN=0
while(1){
for (i=0i<5i++) if (fscanf(fin,"%f ",&x[NN][i])==EOF) goto Lab
NN++
}
Lab: fclose(fin)
for(j=0j<NNj++){
sum=0.0
for(i=0i<NNi++){
sum = sum + x[i][4]*g(j-i)
}
fprintf(fout,"%f %f %f %f %f\n",x[j][0],x[j][1],x[j][2],x[j][3],sum)
}
fclose(fout)
printf("output in %s\n",nameout)
exit(0)
}
==========
输出5列float
如果你要求前4列一模一样,可以修改为 读入4个字符串,1个float 输出4个字符串,1个float。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)