You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:14:57