#include <stdio.h>
#define WINDOW_SIZE1 5 // 定义 motor1 的窗口大小
#define WINDOW_SIZE2 40 // 定义 motor2 的窗口大小
// 定义滑动窗口数据结构
typedef struct {
int arr[WINDOW_SIZE2]; // 使用最大窗口大小来定义静态数组
int window_size;
int index;
int current_size;
int sum; // 记录窗口内元素的总和
} SlidingWindow;
// 初始化滑动窗口
void init_window(SlidingWindow *window, int size) {
window->window_size = size;
window->index = 0;
window->current_size = 0;
window->sum = 0;
for (int i = 0; i < WINDOW_SIZE2; i++) {
window->arr[i] = 0;
}
}
// 更新滑动窗口并计算新平均值
int update_window(SlidingWindow *window, int new_value) {
// 更新窗口中的值
window->arr[window->index] = new_value;
window->index = (window->index + 1) % window->window_size;
// 更新当前窗口大小
if (window->current_size < window->window_size) {
window->current_size++;
}
window->sum = 0;
for (int i = 0; i < window->current_size; i++) {
window->sum += window->arr[i];
}
return window->sum / window->current_size;
}
int main() {
SlidingWindow window1;
SlidingWindow window2;
init_window(&window1, WINDOW_SIZE1);
int data_arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int force1 = 0,force2=0;
// 示例使用
int i = 0,j =0,k=0;
for(k = 0;k<10 ;k++)
{
force1 = update_window(&window1, data_arr1[i++]);
printf("Motor%d initial force: %d\n", i,force1);
}
/*
for(i = 0;i<10 ;i++)
{
force2 = update_window(&window2, data_arr2[j++]);
printf("Motor2 initial force: %d\n", force2);
}
*/
return 0;
}
对上面的改进版本
#include <stdio.h>
#define WINDOW_SIZE1 5 // 定义 motor1 的窗口大小
#define WINDOW_SIZE2 40 // 定义 motor2 的窗口大小
#define WINDOW_MAX 50 // 最大窗口大小
// 定义滑动窗口数据结构
typedef struct {
int arr[WINDOW_MAX]; // 使用最大窗口大小来定义静态数组
int window_size;
int index;
int current_size;
int sum; // 记录窗口内元素的总和
} SlidingWindow;
// 初始化滑动窗口
void init_window(SlidingWindow *window, int size) {
window->window_size = size;
window->index = 0;
window->current_size = 0;
window->sum = 0;
for (int i = 0; i < WINDOW_MAX; i++) {
window->arr[i] = 0;
}
}
// 更新滑动窗口并计算新平均值
int update_window(SlidingWindow *window, int new_value) {
// 如果窗口已满,减去将被替换掉的值
if (window->current_size == window->window_size) {
window->sum -= window->arr[window->index];
} else {
window->current_size++;
}
// 更新窗口中的值
window->sum += new_value;
window->arr[window->index] = new_value;
window->index = (window->index + 1) % window->window_size;
return window->sum / window->current_size;
}
int main() {
SlidingWindow window1;
SlidingWindow window2;
init_window(&window1, WINDOW_SIZE1);
init_window(&window2, WINDOW_SIZE2);
int values1[] = {1, 2, 3, 4, 5, 6};
int values2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("Updating window1:\n");
for (int i = 0; i < sizeof(values1) / sizeof(values1[0]); i++) {
int avg1 = update_window(&window1, values1[i]);
printf("New value: %d, New average: %d\n", values1[i], avg1);
}
return 0;
}