请教:C或C++中卷积的快速算法!

goto123 2003-07-30 08:36:44

最近,编程中碰到有关c卷积的问题,拿来与大家讨论,以求共同进步!!

{题如}:
array1 = [1 2 3 4 5] (长度为:n1 = 5)
array2 = [1 1 1 1] (长度为:n2 = 4)

令: array = array1*array2 (注:此处*为卷积符号)

则: array = [1 3 6 10 14 12 9 5] (长度为:n = 8)

请大家写出自己的算法。(100分,“按劳分配”三天内揭贴!)
...全文
988 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghtsao 2003-07-31
  • 打赏
  • 举报
回复
卷积积分的知识都还给老师了,我晕呀,接点分,升级。
njluhao 2003-07-31
  • 打赏
  • 举报
回复
/*: conv function */

#include <iostream.h>
int getlength(float a);

struct array
{
float* pStart;
int length;
};

struct array conv(array a,array b);

main()
{
int i;
struct array a,b,y;
a.length =5;
b.length =4;
a.pStart =new float [a.length ];
b.pStart =new float [b.length ];

// display a,b & the result of conv
cout<<"a= ";
for (i=0;i<a.length;i++)
{
*(a.pStart+i)=float(i+1);
cout<<*(a.pStart+i)<<" ";
}
cout<<endl;

cout<<"b= ";
for (i=0;i<b.length;i++)
{
*(b.pStart+i)=float(1);
cout<<*(b.pStart+i)<<" ";
}
cout<<endl;

cout<<"y= ";
y=conv(a,b);
for (i=0;i<y.length;i++)
cout<<*(y.pStart+i)<<" ";

cout<<endl;

delete [] a.pStart ;
delete [] b.pStart ;
delete [] y.pStart ;

return 0;
}


struct array conv(array a,array b)
{
int i,j;
float aa,bb;
struct array y;
y.length =a.length +b.length-1 ;
y.pStart =new float [y.length];

for (i=0;i<y.length ;i++)
*(y.pStart +i)=0;

if (a.length >=b.length ) //如果a的长度大于或等于b的长度
{
for (i=0;i<b.length ;i++)
{
for (j=0;j<=i;j++)
{
aa=*(a.pStart+i-j);
bb=*(b.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}

for (i=b.length;i<a.length;i++)
{
for (j=0;j<b.length;j++)
{
aa=*(a.pStart+i-j);
bb=*(b.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}

for (i=a.length;i<a.length+b.length;i++)
{
for (j=i-a.length+1;j<b.length;j++)
{
aa=*(a.pStart+i-j);
bb=*(b.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}
}

else //如果b的长度大于或等于a的长度
{
for (i=0;i<a.length ;i++)
{
for (j=0;j<=i;j++)
{
bb=*(b.pStart+i-j);
aa=*(a.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}

for (i=a.length;i<b.length;i++)
{
for (j=0;j<a.length;j++)
{
bb=*(b.pStart+i-j);
aa=*(a.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}

for (i=b.length;i<b.length+a.length-1;i++)
{
for (j=i-b.length+1;j<a.length;j++)
{
bb=*(b.pStart+i-j);
aa=*(a.pStart +j);
*(y.pStart +i)=*(y.pStart +i)+aa*bb;
}
}
}

return(y);
}
njluhao 2003-07-31
  • 打赏
  • 举报
回复
楼主up的方式到是满特别的嘛~~
我这里匆匆写了几行代码,请各位高手批评指正,希望能给楼主带来一点帮助!!
我把卷积过程用两个临界状态分成了三个情况来讨论,
临界状态如下:
1)a = 1 2 3 4 5 2) a = 1 2 3 4 5
b'= 1 1 1 1 b'= 1 1 1 1
huigll 2003-07-31
  • 打赏
  • 举报
回复
不懂什么是卷积,
能把公式写上来么 ??
goto123 2003-07-31
  • 打赏
  • 举报
回复
“sorry.体例中的array结果写错了

应该是:array = [1 3 6 10 15 14 12 9 5] (长度为:n = 9)

请大家接分啊……”以上的更改是错误的!!


原题没错,夜深了,头有点昏,就当是自己来up了!!!:)
goto123 2003-07-31
  • 打赏
  • 举报
回复
sorry.体例中的array结果写错了

应该是:array = [1 3 6 10 15 14 12 9 5] (长度为:n = 9)

请大家接分啊……
happycock 2003-07-31
  • 打赏
  • 举报
回复
动作慢了,我要分啊。
happycock 2003-07-31
  • 打赏
  • 举报
回复
只是演示,为了简单,将一些初始化、动分数组省略了。VC6,TC2都能编译运行。
#include <stdio.h>
void juanji(int* a, int m, int* b, int n, int* r)
{
int i, j, t = m + n - 1;
for (i = 0; i < t; i++)
for (j = 0; j < m && j <= i; j++)
if (i - j < n) r[i] += a[j] * b[i - j];
}
void main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int b[4] = { 1, 1, 1, 1 };
int r[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }, i;
juanji(a, 5, b, 4, r);
for (i = 0; i < 8; i++) printf("%d ", r[i]);
}
BlueSky2008 2003-07-31
  • 打赏
  • 举报
回复
a,b的卷积:
-1
(DFT )( (DFT )(a) * (DFT )(b) )
2n 2n 2n
goto123 2003-07-31
  • 打赏
  • 举报
回复
多谢njluhao老兄啦~~
mmmcd 2003-07-31
  • 打赏
  • 举报
回复
可以完全按多项式相乘的做法。
njluhao 2003-07-30
  • 打赏
  • 举报
回复
卷积公式:
若y=a*h
则y(i)的值等于 a(k)*h(i-k)在k从负无穷到正无穷上的累加和。
imeng99 2003-07-30
  • 打赏
  • 举报
回复
什么是卷积的问题?楼主说详细一点。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧