c - 如何编写一个平滑给定数组的函数
问题描述
我正在编写一个函数,该函数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
其中si
是i-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("");
}
解决方案
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 项,所以它将保持不变。
推荐阅读
- angular - 如何使用 node js buildpack 在 Cloud Foundry 上部署 Angular 6 应用程序?
- node.js - 在 Nodejs 和 MongoDB 的单元测试中使用fixtures
- amazon-web-services - 如何检查第三方 AMI 在我的 AWS 账户中运行?
- ios - 如何减小ipa文件的大小
- r - 在 R 中跟踪具有滞后的属性
- python - 使用 colorsys 模块在 Mandelbrot 和 Julia 集上产生彩虹效果
- r - 有条件地选择 dplyr 中的列
- sql - 使用左连接加入 3 个表
- python - 从数据框中的索引中获取最小值
- c++ - 无法将多个键添加到以结构为键的映射