Rust高性能线性代数库faer的使用,faer提供快速矩阵运算和数值计算功能

faer logo

faer

faer是一个Rust crate,实现了低级别线性代数例程和一个高级别包装器以便于使用,采用纯Rust编写。其目标是提供一个功能齐全的线性代数库,重点在于可移植性、正确性和性能。

当前MSRV(最低支持的Rust版本)是Rust 1.84.0。

贡献

如果您想为faer做贡献,请查看"good first issue"问题列表。这些都是(或应该是)适合入门的问题,并且通常包含详细的说明。如果有任何不清楚的地方,请在Discord服务器或问题本身提问!

基准测试

请参阅主网站上的基准测试页面。

安装

在项目目录中运行以下Cargo命令:

cargo add faer

或者将以下行添加到您的Cargo.toml文件中:

faer = "0.22.6"

完整示例代码

use faer::{mat, Mat};

fn main() {
    // 创建一个3x3矩阵
    let a = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0]
    ];
    
    // 创建另一个3x3矩阵
    let b = mat![
        [9.0, 8.0, 7.0],
        [6.0, 5.0, 4.0],
        [3.0, 2.0, 1.0]
    ];
    
    // 矩阵加法
    let c = &a + &b;
    println!("Matrix addition:");
    println!("{}", c);
    
    // 矩阵乘法
    let d = &a * &b;
    println!("\nMatrix multiplication:");
    println!("{}", d);
    
    // 矩阵转置
    let a_transposed = a.transpose();
    println!("\nMatrix transpose:");
    println!("{}", a_transposed);
    
    // 创建单位矩阵
    let identity = Mat::<f64>::identity(3);
    println!("\nIdentity matrix:");
    println!("{}", identity);
    
    // 矩阵与标量运算
    let scaled = &a * 2.0;
    println!("\nScalar multiplication:");
    println!("{}", scaled);
}
use faer::{mat, Mat, Solver};

fn linear_system_example() {
    // 创建一个线性系统 Ax = b
    let a = mat![
        [2.0, 1.0, -1.0],
        [-3.0, -1.0, 2.0],
        [-2.0, 1.0, 2.0]
    ];
    
    let b = mat![
        [8.0],
        [-11.0],
        [-3.0]
    ];
    
    // 使用LU分解求解
    let lu = a.partial_piv_lu();
    let x = lu.solve(&b);
    
    println!("Solution to linear system:");
    println!("x = {}", x.unwrap());
}

fn cholesky_example() {
    // 创建一个对称正定矩阵
    let a = mat![
        [4.0, 12.0, -16.0],
        [12.0, 37.0, -43.0],
        [-16.0, -43.0, 98.0]
    ];
    
    // Cholesky分解
    let cholesky = a.cholesky();
    if let Some(chol) = cholesky {
        println!("Cholesky decomposition:");
        println!("L = {}", chol.l());
    }
}

fn qr_example() {
    // QR分解示例
    let a = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0],
        [10.0, 11.0, 12.0]
    ];
    
    let qr = a.qr();
    println!("QR decomposition:");
    println!("Q = {}", qr.compute_q());
    println!("R = {}", qr.r());
}

fn main() {
    // 基本矩阵运算
    basic_matrix_operations();
    
    // 线性系统求解
    linear_system_example();
    
    // Cholesky分解
    cholesky_example();
    
    // QR分解
    qr_example();
}

1 回复

Rust高性能线性代数库faer的使用指南

介绍

faer是一个用纯Rust编写的高性能线性代数库,专注于提供快速的矩阵运算和数值计算功能。该库采用现代数值算法和优化技术,在保持内存安全的同时提供接近原生性能的计算能力。faer支持多种矩阵分解、线性系统求解、特征值计算等常见线性代数操作。

主要特性

  • 纯Rust实现,无外部依赖
  • 支持f32/f64浮点类型
  • 提供BLAS级别的性能
  • 丰富的矩阵分解算法(LU、QR、Cholesky等)
  • 并行计算支持
  • 稀疏矩阵支持

安装方法

在Cargo.toml中添加依赖:

[dependencies]
faer = "0.15"

基础使用示例

1. 创建矩阵

use faer::mat;

fn main() {
    // 创建3x3矩阵
    let matrix = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0]
    ];
    
    println!("Matrix:\n{}", matrix);
}

2. 矩阵乘法

use faer::{mat, prelude::*};

fn main() {
    let a = mat![
        [1.0, 2.0],
        [3.0, 4.0]
    ];
    
    let b = mat![
        [5.0, 6.0],
        [7.0, 8.0]
    ];
    
    let result = &a * &b;
    println!("Matrix multiplication result:\n{}", result);
}

3. 求解线性系统

use faer::{mat, prelude::*};

fn main() {
    // 系数矩阵A
    let a = mat![
        [3.0, 1.0],
        [1.0, 2.0]
    ];
    
    // 右侧向量b
    let b = mat![
        [9.0],
        [8.0]
    ];
    
    // 求解Ax = b
    let x = a.partial_piv_lu().solve(&b);
    println!("Solution x:\n{}", x);
}

4. 特征值计算

use faer::{mat, prelude::*};

fn main() {
    let matrix = mat![
        [4.0, 1.0],
        [1.0, 3.0]
    ];
    
    // 计算特征值分解
    let eig = matrix.eigendecomposition();
    println!("Eigenvalues: {:?}", eig.complex_eigenvalues());
}

高级功能示例

并行矩阵运算

use faer::{mat, prelude::*, Parallelism};

fn main() {
    let a = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0]
    ];
    
    // 使用并行计算进行LU分解
    let lu = a.partial_piv_lu_with_parallelism(Parallelism::Rayon(0));
    println!("LU decomposition completed");
}

稀疏矩阵操作

use faer::{mat, sparse::*};

fn main() {
    // 创建稀疏矩阵
    let values = &[1.0, 2.0, 3.0];
    let row_indices = &[0, 1, 2];
    let col_indices = &[0, 1, 2];
    
    let sparse_mat = SparseColMat::new(3, 3, col_indices, row_indices, values);
    println!("Sparse matrix created");
}

完整示例demo

use faer::{mat, prelude::*, Parallelism, sparse::*};

fn main() {
    println!("=== faer库完整使用示例 ===");
    
    // 1. 创建矩阵示例
    println!("\n1. 创建矩阵:");
    let matrix = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0]
    ];
    println!("创建的矩阵:\n{}", matrix);
    
    // 2. 矩阵乘法示例
    println!("\n2. 矩阵乘法:");
    let a = mat![
        [1.0, 2.0],
        [3.0, 4.0]
    ];
    
    let b = mat![
        [5.0, 6.0],
        [7.0, 8.0]
    ];
    
    let result = &a * &b;
    println!("矩阵乘法结果:\n{}", result);
    
    // 3. 求解线性系统示例
    println!("\n3. 求解线性系统:");
    let a_system = mat![
        [3.0, 1.0],
        [1.0, 2.0]
    ];
    
    let b_vector = mat![
        [9.0],
        [8.0]
    ];
    
    let solution = a_system.partial_piv_lu().solve(&b_vector);
    println!("线性系统解:\n{}", solution);
    
    // 4. 特征值计算示例
    println!("\n4. 特征值计算:");
    let eig_matrix = mat![
        [4.0, 1.0],
        [1.0, 3.0]
    ];
    
    let eig_decomp = eig_matrix.eigendecomposition();
    println!("特征值: {:?}", eig_decomp.complex_eigenvalues());
    
    // 5. 并行计算示例
    println!("\n5. 并行矩阵运算:");
    let parallel_matrix = mat![
        [1.0, 2.0, 3.0],
        [4.0, 5.0, 6.0],
        [7.0, 8.0, 9.0]
    ];
    
    let lu_decomp = parallel_matrix.partial_piv_lu_with_parallelism(Parallelism::Rayon(0));
    println!("并行LU分解完成");
    
    // 6. 稀疏矩阵示例
    println!("\n6. 稀疏矩阵操作:");
    let sparse_values = &[1.0, 2.0, 3.0];
    let sparse_row_indices = &[0, 1, 2];
    let sparse_col_indices = &[0, 1, 2];
    
    let sparse_matrix = SparseColMat::new(3, 3, sparse_col_indices, sparse_row_indices, sparse_values);
    println!("稀疏矩阵创建成功");
    
    println!("\n=== 示例运行完成 ===");
}

性能优化建议

  1. 对于大型矩阵运算,使用faer::mat!宏而不是逐元素构建
  2. 启用适当的并行级别(Parallelism)
  3. 重用矩阵分解对象以避免重复计算
  4. 使用适当的数据布局(列优先或行优先)

注意事项

  • faer目前仍在积极开发中,API可能会有变化
  • 某些高级功能可能需要启用特定的cargo feature
  • 对于特别大的矩阵,建议使用稀疏矩阵格式

这个库为Rust开发者提供了强大的数值计算能力,特别适合科学计算、机器学习和工程应用场景。

回到顶部