4 个版本
使用旧的 Rust 2015
0.1.3 | 2017 年 2 月 8 日 |
---|---|
0.1.2 | 2017 年 2 月 1 日 |
0.1.1 | 2017 年 1 月 19 日 |
0.1.0 | 2017 年 1 月 19 日 |
#536 in 科学
12KB
89 行
用 Rust 编写的卡尔曼滤波和光滑库
目前,库仅提供时不变线性卡尔曼滤波和光滑技术,称为固定间隔光滑(Rauch-Tung-Striebel 光滑器),该技术依赖于整个数据集的卡尔曼滤波估计。linearkalman
依赖于 rulinalg 库来实现线性代数结构和操作,因此输入数据应为一个 std::vec::Vec
的 Vector 对象,即向量的向量。
为了使用此库,请确保您的 Cargo.toml
文件包含以下内容
[dependencies]
linearkalman = "0.1.3"
然后可以使用以下方式导入库
extern crate linearkalman;
示例
以下示例假设具有 2 维状态空间模型的 3 维测量数据。借助来自 rulinalg 的几个宏,使用库运行卡尔曼滤波和光滑器的简单尝试如下。
#[macro_use]
extern crate rulinalg;
extern crate linearkalman;
use rulinalg::vector::Vector;
use linearkalman::KalmanFilter;
fn main() {
let kalman_filter = KalmanFilter {
// Process noise covariance
q: matrix![1.0, 0.1;
0.1, 1.0],
// Measurement noise matrix
r: matrix![1.0, 0.2, 0.1;
0.2, 0.8, 0.5;
0.1, 0.5, 1.2],
// Observation matrix
h: matrix![1.0, 0.7;
0.5, 0.7;
0.8, 0.1],
// State transition matrix
f: matrix![0.6, 0.2;
0.1, 0.3],
// Initial guess for state mean at time 1
x0: vector![1.0, 1.0],
// Initial guess for state covariance at time 1
p0: matrix![1.0, 0.0;
0.0, 1.0],
};
let data: Vec<Vector<f64>> = vec![vector![1.04, 2.20, 3.12],
vector![1.11, 2.33, 3.34],
vector![1.23, 2.21, 3.45]];
let run_filter = kalman_filter.filter(&data);
let run_smooth = kalman_filter.smooth(&run_filter.0, &run_filter.1);
// Print filtered and smoothened state variable coordinates
println!("filtered.1,filtered.2,smoothed.1,smoothed.2");
for k in 0..3 {
println!("{:.6},{:.6},{:.6},{:.6}",
&run_filter.0[k].x[0], &run_filter.0[k].x[1],
&run_smooth[k].x[0], &run_smooth[k].x[1])
}
}
examples
目录包含代码示例,允许从 CSV 文件导入数据并将过滤和光滑数据返回到 stdout
。
许可证
本项目许可协议为 GPL3。
依赖项
~1MB
~18K SLoC