3

我正在开发一些软件,我在其中管理一个浮动缓冲区,Vec<T>其中T是 anf32f64. 我有时需要将此缓冲区或其中的部分解释为数学向量。为此,我正在MatrixSlice和朋友们在nalgebra.

我可以创建一个DVectorSliceMut,例如,以下方式

fn as_vector<'a>(slice: &'a mut [f64]) -> DVectorSliceMut<'a, f64> {
    DVectorSliceMut::from(slice)
}

但是,有时我需要稍后从DVectorSliceMut具有原始生命周期的 中提取原始切片'a。有没有办法做到这一点?

StorageMuttrait 有一个as_mut_slice成员函数,但返回切片的生命周期是对Storage实现者的引用的生命周期,而不是原始切片的生命周期。DVectorSliceMut我可以接受必要时消耗的解决方案。

更新:从v0.28.0开始,方法into_sliceinto_slice_mut已分别添加到SliceStorageSliceStorageMut特征中。nalgebra

4

2 回答 2

2

鉴于nalgebra(v0.27.1) 的当前 API,您无能为力,除了:

  • 寿命较短的StorageMut::as_mut_slice
  • 对这样的功能提出功能请求nalgebra (您似乎已经这样做了)
  • 使用您自己的unsafe代码制作StorageMut::ptr_mut&'a mut

您可以使用第三个选项,直到nalgebra获得更新并在您自己的代码中实现类似的内容:

use nalgebra::base::dimension::Dim;
use nalgebra::base::storage::Storage;
use nalgebra::base::storage::StorageMut;

fn into_slice<'a>(vec: DVectorSliceMut<'a, f64>) -> &'a mut [f64] {
    let mut inner = vec.data;
    // from nalgebra
    // https://docs.rs/nalgebra/0.27.1/src/nalgebra/base/matrix_slice.rs.html#190
    let (nrows, ncols) = inner.shape();
    if nrows.value() != 0 && ncols.value() != 0 {
        let sz = inner.linear_index(nrows.value() - 1, ncols.value() - 1);
        unsafe { core::slice::from_raw_parts_mut(inner.ptr_mut(), sz + 1) }
    } else {
        unsafe { core::slice::from_raw_parts_mut(inner.ptr_mut(), 0) }
    }
}
于 2021-06-17T22:57:32.143 回答
0

从v0.28.0开始,方法into_sliceinto_slice_mut返回原始切片已分别添加到SliceStorageSliceStorageMut特征中。nalgebra

于 2021-10-01T21:06:37.173 回答