C语言写加权平均算法
时间: 2023-07-10 18:24:16 浏览: 498
加权平均算法是指在计算平均值时,不同数据的权重不同。下面是用C语言实现加权平均算法的示例代码:
```c
#include <stdio.h>
int main() {
int num[5] = {10, 20, 30, 40, 50}; // 数据
int weight[5] = {1, 2, 3, 4, 5}; // 权重
int sum = 0;
int weight_sum = 0;
float weighted_avg;
for (int i = 0; i < 5; i++) {
sum += num[i] * weight[i];
weight_sum += weight[i];
}
weighted_avg = (float)sum / weight_sum;
printf("加权平均值为: %.2f\n", weighted_avg);
return 0;
}
```
在这个例子中,我们有5个数据和5个对应的权重。在循环中,我们将每个数据乘以它的权重,并将结果加起来。然后,我们将所有权重相加,得到一个总权重。最后,我们将加权总和除以总权重,得到加权平均值。
相关问题
用C语言写一个加权递推平均滤波算法函数,要求减少内存资源使用
在C语言中,我们可以编写一个加权递推平均滤波算法函数,该算法用于处理序列数据并计算其加权平均值,同时尽量减少内存使用。下面是一个简单的示例:
```c
#include <stdio.h>
#define WINDOW_SIZE 5 // 设置滑动窗口大小
// 结构体存储滤波所需的数据
typedef struct {
float weights[WINDOW_SIZE]; // 权重数组
int index; // 当前指针位置
float sum; // 滑动窗口内的累积和
} WeightedFilter;
// 初始化滤波器
void init_weighted_filter(WeightedFilter* filter) {
for (int i = 0; i < WINDOW_SIZE; ++i) {
filter->weights[i] = 1.0 / WINDOW_SIZE; // 等权重分配
}
filter->index = 0;
filter->sum = 0;
}
// 添加新数据并更新平均值
float add_and_average(float value, WeightedFilter* filter) {
if (filter->index == WINDOW_SIZE - 1) { // 如果已满,移动旧值到权重数组末尾
filter->weights[0] = filter->weights[1];
++filter->index;
}
filter->weights[filter->index] *= filter->weights[filter->index - 1]; // 更新当前权重
filter->weights[filter->index] += 1.0; // 新增权重
filter->sum += value * filter->weights[filter->index]; // 更新累积和
return filter->sum;
}
// 示例用法
int main() {
WeightedFilter filter;
init_weighted_filter(&filter);
for (int i = 0; i < 10; ++i) {
float data = i;
printf("Filtered value at %d: %.2f\n", i, add_and_average(data, &filter));
}
return 0;
}
```
这个例子中,我们通过维护一个固定大小的权重数组和一个指针跟踪当前过滤状态,避免了每次都创建新的缓冲区,从而减少了内存使用。`add_and_average`函数每次处理一个新数据点时都会将它与之前的数据结合,计算出加权平均值。
使用C语言编写一个滑动窗口内数据的加权平均值算法
下面是一个使用C语言编写的滑动窗口内数据的加权平均值算法:
```c
#include <stdio.h>
#define WINDOW_SIZE 5 // 窗口大小
#define ALPHA 0.5 // 加权系数
int main() {
int data[WINDOW_SIZE] = {0}; // 存储窗口内的数据
int i, sum = 0;
// 用0初始化数据数组
for (i = 0; i < WINDOW_SIZE; i++) {
data[i] = 0;
}
// 模拟输入数据,每次循环添加一个新数据
for (i = 0; i < 10; i++) {
int new_data = i + 1;
// 将新数据添加到数据数组末尾
for (int j = 0; j < WINDOW_SIZE - 1; j++) {
data[j] = data[j + 1];
}
data[WINDOW_SIZE - 1] = new_data;
// 计算加权平均值
sum = 0;
for (int j = 0; j < WINDOW_SIZE; j++) {
sum += data[j] * (ALPHA * (1 - ALPHA) * j);
}
float weighted_average = sum / (ALPHA * (1 - ALPHA) * (WINDOW_SIZE - 1) + 1);
// 输出结果
printf("New data: %d, Weighted average: %.2f\n", new_data, weighted_average);
}
return 0;
}
```
在这个算法中,我们使用一个大小为 `WINDOW_SIZE` 的数组来存储窗口内的数据。每次循环,我们向数组中添加一个新的数据,并将窗口向右移动。然后,我们计算数组中所有数据的加权平均值,其中加权系数 `ALPHA` 决定了每个数据点的权重。最后,我们输出新的数据和计算出的加权平均值。
需要注意的是,在计算加权平均值时,我们使用了一个加权系数的公式,其中 `j` 表示数据点在窗口中的位置,`sum` 是所有数据点加权之和,`weighted_average` 是计算出的加权平均值。
阅读全文