0

这是我尝试过的

use ndarray::{arr2, s};
let mut a = arr2(&[[1, 2, 3],
                   [4, 5, 6]]);
let b = arr2(&[[2, 3, 3],
               [5, 6, 6]]);

a.slice_mut(s![.., ..2]).assign(&a.slice_mut(s![.., 1..]));

由于借用规则(playround link),这显然失败了:

error[E0499]: cannot borrow `a` as mutable more than once at a time
  --> src/main.rs:13:38
   |
13 |     a.slice_mut(s![.., ..2]).assign(&a.slice_mut(s![.., 1..]));
   |     -                        ------  ^ second mutable borrow occurs here
   |     |                        |
   |     |                        first borrow later used by call
   |     first mutable borrow occurs here

a就是我所拥有的,b也是我想要得到的。

在 numpy 中,它就像a[:, :2] = a[:, 1:].

PS也许在nalgebra板条箱中有一个简单的解决方案?

4

2 回答 2

0

在 ndarray 的 master 分支中,有一个特殊的宏,比split_at_mut()它支持任意切片更方便 - 但是当切片重叠时它会恐慌:

use ndarray::multislice;
use ndarray::prelude::*;
let mut arr: Array1<_> = (0..4).collect();
let (mut a, mut b) = multislice!(arr, mut [..;2], mut [1..;2]);
a.assign(&b);

[1,1,3,3]

他们甚至解决了丢番图方程来检查它。它发生在运行时而不是编译时split_at_mut

于 2019-08-30T19:30:02.857 回答
-2

好的,我知道了

use ndarray::{arr2, s,Array};

let mut a = arr2(&[[1, 2, 3],
                   [4, 5, 6]]);
unsafe{
    let b = a.as_mut_ptr();
    let c = Vec::<i32>::from_raw_parts(b, 6, 6);
    let mut d = Array::from_shape_vec((2, 3), c).unwrap();
    a.slice_mut(s![.., ..2]).assign(&d.slice_mut(s![.., 1..]));
    std::mem::forget(d);
}
println!("{:?}",a);
于 2019-08-29T21:54:41.673 回答