2 个稳定版本
1.0.1 | 2020年8月19日 |
---|
#1291 in 数据结构
22KB
135 行
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>
- 当然,也是一样的。
实现的功能
VecDimensionShift2D
,VecDimensionShift2DFlatten
以及为Vec<T>
实现的2..16维度的trait
。- 用于创建所需N维度的
trait
的make_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
- 创建仅您需要的
trait
(例如,2D和3D) - -> 创建1D * 12长度的缓冲区
- -> 将维度转换为2D * 6长度的缓冲区
- -> 将维度转换为( 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