Rust中如何const初始化ndarray数组?是否有类似nalgebra的等效方法
ndarray的const初始化方法问题
我在程序中使用了一个ndarray数组(ndarray和nalgebra分别导入为nd和na),代码如下:
let test: nd::ArrayBase<nd::OwnedRepr<na::Vector2<f64>>, nd::Dim<[usize; 1]>> = nd::arr1( &[ // row 1 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 2 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 3 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), ] );
我希望将该数组声明为const,但arr1并非const函数,无法直接实现。nalgebra可通过from_array_storage方法const初始化向量/矩阵,示例代码如下:
const DIRECTION_VELOCITIES: na::SVector<na::Vector2<f64>, 9> = na::SVector::from_array_storage(na::ArrayStorage([[ // row 1 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 2 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 3 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), ]]));
请问ndarray是否有等效的const初始化方法?
回答
ndarray目前没有像nalgebra的from_array_storage那样专门的const初始化API,但可以通过直接构造ArrayBase的方式实现const数组,具体有两种方案:
方案1:构造拥有所有权的const ArrayBase
先定义一个const原始数组存储元素,再通过ArrayBase::from_data_dim和OwnedRepr::new_const组合构造const数组:
const TEST_DATA: [na::Vector2<f64>; 9] = [ // row 1 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 2 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 3 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), ]; const TEST: nd::ArrayBase<nd::OwnedRepr<na::Vector2<f64>>, nd::Dim<[usize; 1]>> = nd::ArrayBase::from_data_dim(nd::OwnedRepr::new_const(TEST_DATA), nd::Dim([9]));
需要注意:该方案要求ndarray版本至少为0.15(此版本引入了OwnedRepr::new_const等const构造支持),且元素类型需实现Copy(这里na::Vector2<f64>满足要求)。
方案2:使用const数组视图(只读场景)
如果不需要拥有数组所有权,仅需只读访问,可直接构造ArrayView1静态引用:
const TEST_DATA: [na::Vector2<f64>; 9] = [ // row 1 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 2 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), // row 3 na::Vector2::new(1.0, -1.0), na::Vector2::new(1.0, 0.0), na::Vector2::new(1.0, 1.0), ]; const TEST_VIEW: nd::ArrayView1<'static, na::Vector2<f64>> = nd::ArrayView1::from(&TEST_DATA);
这种方式更轻量,无需分配内存,适合仅需读取的场景。
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

