[英]Convolution in C without Stackoverflow
我正在嘗試在C語言中做卷積算法,但是正在卷積數組上堆疊。
#include <stdio.h>
#include <math.h>
#include <stddef.h>
#define convtotal 2590
int main(int argc, char *argv[]) {
int m,n,i,j;
double x[convtotal],h[convtotal];
m=sizeof(x)/sizeof(double);
n=sizeof(h)/sizeof(double);
double aux1[convtotal], aux2[convtotal],conv[convtotal][1];
for (i=0;i<n+m;i++){
if (i<n)
aux1[i]=x[i];
else
aux1[i]=0;
if (i<m)
aux2[i]=h[i];
else
aux2[i]=0;
}
for (i=0;(n+m-1);i++){
conv[i][1]=0;
for (j=0;j<m;j++)
if (i-j+1>0)
conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);
}
}
對這個問題有什么建議嗎?
for (i=0;(n+m-1);i++){
不是i < m+ n - 1
嗎?
for (i=0;(n+m-1);i++){
conv[i][1]=0;
for (j=0;j<m;j++)
if (i-j+1>0)
conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);
}
(n + m-1)個以常數為停止條件的無限循環。 實際上不是無限的,直到它出現段錯誤為止。
兩個問題:
for (i=0;(n+m-1);i++)
您沒有將i
限制為任何值,因此當您到達數組末尾時,循環不會退出。 它只會一直遞增i
直到您遇到不屬於您的內存為止,這時您會遇到段錯誤。 由於conv
只適用於m
或n
,我想你打算寫
for (i = 0; i < n; i++)
其次,您將conv
聲明為Nx1數組,這意味着第二維中唯一的合法索引可能是0,因此這些行
conv[i][1] = 0;
和
conv[i][1]=conv[i][1]+(aux1[j]*aux2[i-j+1]);
應該
conv[i][0] = 0;
和
conv[i][0]=conv[i][0]+(aux1[j]*aux2[i-j+1]);
不知道為什么要聲明一個Nx1數組(似乎可以用一個維度聲明conv
),但是我可能會遺漏一些明顯的東西。
請注意,您的x
和h
數組最初包含隨機值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.