#unit #array #unit-system #si #matrix #multidimensionnal

bin+lib ndarray-unit

为 ndarray 类型提供单位系统的包

5 个版本

0.2.2 2019 年 12 月 4 日
0.2.1 2019 年 12 月 4 日
0.2.0 2019 年 12 月 3 日
0.1.1 2019 年 12 月 2 日
0.1.0 2019 年 12 月 1 日

#1249 in 数学

MIT/Apache

1MB
533

包含 (WOFF 字体, 190KB) docs/FiraSans-Medium.woff, (WOFF 字体, 185KB) docs/FiraSans-Regular.woff, (WOFF 字体, 94KB) docs/SourceSerifPro-Bold.ttf.woff, (WOFF 字体, 89KB) docs/SourceSerifPro-Regular.ttf.woff, (WOFF 字体, 56KB) docs/SourceCodePro-Regular.woff, (WOFF 字体, 56KB) docs/SourceCodePro-Semibold.woff 和更多.

Build Status - Travis Tests - Github docs.rs

ndarray-unit


⚠️ 此项目处于积极开发中,此 README 使用的是可能不同于在 crates.io 上上传的文档注释。请始终检查 doc.rs 以获取最新文档。⚠️


此 crate 提供了一个表示多维数组的结构体,并带有 Unit。它允许对 n 维数组进行考虑单位的计算。

示例

use ndarray_unit::*;

extern crate ndarray;
use ndarray::Array;

fn main() {
    println!("meter / second = {}", &get_meter() / &get_second());

    let arr1 = Array::linspace(30.0, 40.0, 11);
    let arr_u1 = ArrayUnit::new(arr1, get_joule());

    let arr2 = Array::linspace(10.0, 60.0, 11);
    let arr_u2 = ArrayUnit::new(arr2, get_second());

    let arr3 = ndarray::array![
        [1.0, 0.0, 2.0, 6.0],
        [1.0, 2.0, 3.0, 5.0],
        [1.0, 2.0, 3.0, 6.0]
    ];
    let arr_u3 = ArrayUnit::new(arr3, get_meter());

    println!("arr_u3 = {}", arr_u3);
    println!("==========================================================");
    println!("{}\n*{}\n={}", &arr_u1, &arr_u2, &arr_u1 * &arr_u2);
    println!("==========================================================");
    println!("{}\n/{}\n={}", &arr_u1, &arr_u2, &arr_u1 / &arr_u2);
    println!("==========================================================");
    println!("{}\n+{}\n={}", &arr_u1, &arr_u1, &arr_u1 + &arr_u1);
    println!("==========================================================");
    println!("{}\n-{}\n={}", &arr_u2, &arr_u2, &arr_u2 - &arr_u2);
    println!("==========================================================");
}

输出

// meter / second = m·s⁻¹
// arr_u3 = [[1, 0, 2, 6],
//  [1, 2, 3, 5],
//  [1, 2, 3, 6]] m
// ==========================================================
// [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] m²·kg·s⁻²
// *[10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] s
// =[300, 465, 640, 825, 1020, 1225, 1440, 1665, 1900, 2145, 2400] m²·kg·s⁻¹
// ==========================================================
// [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] m²·kg·s⁻²
// /[10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] s
// =[3, 2.0666, 1.6, 1.32, 1.1333, 1, 0.9, 0.8222, 0.76, 0.7090, 0.6666] m²·kg·s⁻³
// ==========================================================
// [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] m²·kg·s⁻²
// +[30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] m²·kg·s⁻²
// =[60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80] m²·kg·s⁻²
// ==========================================================
// [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] s
// -[10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60] s
// =[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] s
// ==========================================================

恐慌

当您尝试将具有不同 Unit 的两个 ArrayUnit 相加或相减时,程序会恐慌。

extern crate ndarray;
use ndarray::Array;
use ndarray_unit::*;

let arr1 = Array::linspace(30.0, 40.0, 11);
let arr_u1 = ArrayUnit::new(arr1, get_joule());

let arr2 = Array::linspace(10.0, 60.0, 11);
let arr_u2 = ArrayUnit::new(arr2, get_second());

// let result = &arr_u1 + &arr_u2; // ==> panicking

开发

主分支的文档在 github.io

功能

  • 基本的单位系统处理乘法和除法
  • 单位 + ndarray 的 ArrayUnit 包装器
  • 对 &ArrayUnit 的操作
    • Mul/Div <&ArrayUnit>
    • Add/Sub <&ArrayUnit>(现在如果单位不相等会恐慌,将来可能会改变)
    • 与标量进行 Mul/Div
    • 与标量进行 Add/Sub
  • 添加前缀(mm, cm, dm, m, km)
  • 基本的 ndarray 函数
    • 转置
    • 缩放
    • ...

测试 & 文档

  • 基本的单位系统处理乘法和除法
  • 单位 + ndarray 的 ArrayUnit 包装器
  • 对 &ArrayUnit 的操作
    • Mul/Div <&ArrayUnit>
    • Add/Sub <&ArrayUnit>(现在如果单位不相等会恐慌,将来可能会改变)
    • 与标量进行 Mul/Div
    • 与标量进行 Add/Sub
  • 添加前缀(mm, cm, dm, m, km)
  • 基本的 ndarray 函数
    • 转置
    • 缩放
    • ...

依赖关系

~1.5MB
~25K SLoC