首页 > 解决方案 > 如何编写一个平滑给定数组的函数

问题描述

我正在编写一个函数,该函数void smoothData(int n, double data[])根据1:2:1下面给出的过滤器使用签名平滑给定的 n 元素数组。我不应该生成整个新数组并将其复制回原始数组。

si=(d(i−1)+2*di+d(i+1))/4

平滑数组的第一个和最后一个元素应该从以下规则而不是使用si

s0=(3*d0+d1)/4

s(n−1)=(d(n−2)+3*d(n−1))/4

其中sii-th平滑数组中的元素,d是输入数组。 d(n-1)(n-1)th原始数组等的元素。

我得到了1.250, 2.250, 4.000, 4.000. 第三个元素是错误的,应该是3.500.

https://i.stack.imgur.com/VkJqb.png

#include <stdio.h>

void smoothData(int n, double data[])
{

    double s0 = (data[0] * 3 + data[1]) / 4.0;
    double sLast = (data[n-2] + data[n-1] * 3) / 4.0;
    double si = 0.0;
    double di = data[0];
    for (int i = 0; i<=n-4; i++) {  
        si = (di + 2 * data[i+1] + data[i+2])/4.0;
        di = data[i+1];
        data[i+1] = si;            
    }
    data[0] = s0;
    data[n-1] = sLast;    
}

int main()
{

    double data[] = {1.0, 2.0, 4.0, 4.0};
    smoothData(4, data);
    printf("Smoothed data: %.3lf", data[0]);
    for (int i = 1; i < 4; i++) {
        printf(", %.3lf", data[i]);
    }
    puts("");
}

标签: c

解决方案


for (int i = 0; i<=n-4; i++)

这意味着如果n为 4,则循环只会执行一次,因为0 <= 0为真。所以循环将写入data[i+1] = si;项目1。然后停止。

稍后你写data[0] = s0;哪个是第 0 项,data[n-1] = sLast;哪个是第 3 项。但是你没有写到第 2 项,所以它将保持不变。


推荐阅读