1. Học hỏi
  2. /
  3. Khoa Học
  4. /
  5. Tối ưu hóa mã R với Rcpp

Connected

Bài tập

Trung bình trượt (bằng C++)

Hàm trung bình trượt dạng vector hóa, rollmean3() chạy khá nhanh nhưng lại rất khó đọc. Rất khó nhận ra đây là mã tính trung bình trượt, khiến hàm khó gỡ lỗi và bảo trì.

Phiên bản thứ hai, rollmean2(), chậm hơn nhưng dễ đọc hơn. Nếu ta chuyển nó sang C++, hy vọng sẽ vừa dễ đọc vừa chạy nhanh.

rollmean2() đã được định nghĩa sẵn trong không gian làm việc; bạn có thể in định nghĩa của nó để nhớ lại cách hoạt động. Giờ bạn sẽ dịch rollmean2() sang C++, gán thành rollmean4().

Hướng dẫn

100 XP
  • Gán res là một NumericVector có độ dài n và các giá trị được cung cấp bởi phương thức get_na() của NumericVector.
  • Tính total là tổng của window giá trị đầu tiên của x.
  • Tính giá trị trung bình tại vị trí window - 1 bằng tổng chia cho độ rộng cửa sổ.
  • Trong vòng lặp thứ hai, cập nhật tổng bằng cách trừ phần tử thứ i - window của x và cộng phần tử thứ i của x.