#dimension #buffer #slice #valarray #shiftable

vec-dimension-shift

Vec 的 N 维度移位功能

2 个稳定版本

1.0.1 2020年8月19日

#1291 in 数据结构

MIT 许可证

22KB
135

githubcrates-iodocs-rs
Build Status

Vec Dimension Shift

这个 crate 是对 Vec<T> 的扩展,增加了维度移位功能。

注意:vec-dimension-shift crate 在内部使用不安全的特性。如果您需要更灵活的运行时维度移位或仅安全实现,可以使用 dimension_shift_buffer

什么是“维度移位”?

基本上,

  • Vec<f64> --( 维度移位,到 2 维!)--> Vec<[f64;2]>
    • 原始数据类型是 f64[f64;1],2 维移位后的数据类型是 [f64;2]
    • 原始数据元素类型是 f64,2 维移位后的数据元素类型是 f64
    • 所有数据元素都得到了保留。
  • Vec<[f64;2]> --( 维度转换,展平!)--> Vec<f64>
    • 当然,也是一样的。

实现的功能

  1. VecDimensionShift2DVecDimensionShift2DFlatten以及为Vec<T>实现的2..16维度的trait
  2. 用于创建所需N维度的traitmake_vec_dimension_shift_n_dimension!宏。

注意:默认情况下,2D、3D、4D版本的VecDimensionShift?D是启用的。如果您不需要这些,请设置default-features=false

示例

[dependencies]
vec-dimension-shift = "*"

示例-1

1D -> 2D -> 1D -> 3D -> 1D,并修改一个元素

use vec_dimension_shift::{
 VecDimensionShift2D,
 VecDimensionShift2DFlatten,
 VecDimensionShift3D,
 VecDimensionShift3DFlatten
};

fn d2_and_d3()
{
 let original = vec![0.0, 1.1, 2.2, 3.3, 4.4, 5.5];
 dbg!(&original);

 let mut d2_shifted = original.as_2d_array().unwrap();
 dbg!(&d2_shifted);
 assert_eq!(d2_shifted[0], [0.0, 1.1]);
 assert_eq!(d2_shifted[1], [2.2, 3.3]);
 assert_eq!(d2_shifted[2], [4.4, 5.5]);
 d2_shifted[1][1] = -1.0;

 let flatten = d2_shifted.as_flatten();
 dbg!(&flatten);

 let mut d3_shifted = flatten.as_3d_array().unwrap();
 dbg!(&d3_shifted);
 assert_eq!(d3_shifted[0], [0.0, 1.1, 2.2]);
 assert_eq!(d3_shifted[1], [-1.0, 4.4, 5.5]);
 d3_shifted[1][1] = -2.0;

 let flatten = d3_shifted.as_flatten();
 dbg!(&flatten);

 assert_eq!(flatten, vec![0.0, 1.1, 2.2, -1.0, -2.0, 5.5])
}

示例-2

  1. 创建仅您需要的trait(例如,2D和3D)
  2. -> 创建1D * 12长度的缓冲区
  3. -> 将维度转换为2D * 6长度的缓冲区
  4. -> 将维度转换为( 2D * 3D ) * 2长度的缓冲区
use vec_dimension_shift::make_vec_dimension_shift_n_dimension;

fn n_dimension_macro_generator()
{
 make_vec_dimension_shift_n_dimension! { VecDimensionShift2D, VecDimensionShift2DFlatten, as_2d_array_no_check, to_2d_array_no_check, as_2d_array, to_2d_array, as_2d_array_truncate, to_2d_array_truncate, as_2d_array_padding, to_2d_array_padding, 2 }
 make_vec_dimension_shift_n_dimension! { VecDimensionShift3D, VecDimensionShift3DFlatten, as_3d_array_no_check, to_3d_array_no_check, as_3d_array, to_3d_array, as_3d_array_truncate, to_3d_array_truncate, as_3d_array_padding, to_3d_array_padding, 3 }

 let original = vec![0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10, 11.11];
 dbg!(&original);

 let d2 = original.as_2d_array().unwrap();
 assert_eq!(d2[0], [0.0, 1.1]);
 assert_eq!(d2[1], [2.2, 3.3]);
 assert_eq!(d2[2], [4.4, 5.5]);
 assert_eq!(d2[3], [6.6, 7.7]);
 assert_eq!(d2[4], [8.8, 9.9]);
 assert_eq!(d2[5], [10.10, 11.11]);
 dbg!(&d2);

 let d3 = d2.as_3d_array().unwrap();
 assert_eq!(d3[0], [[0.0, 1.1], [2.2, 3.3], [4.4, 5.5]]);
 assert_eq!(d3[1], [[6.6, 7.7], [8.8, 9.9], [10.10, 11.11]]);
 dbg!(&d3);
}

许可证

作者

依赖项

~310–780KB
~18K SLoC