我是Rust的新手,我正在try 使用Rust对多个矩阵执行顺序Kronecker乘积,即我想做

enter image description here

在巨 Python 中,我知道我可以做到

import numpy as np
from functools import reduce

X = np.array([[0, 1], [1, 0])
matrices = [X for _ in range(8)]
product = reduce(np.kron, matrices)

并得到想要的结果.如何在铁 rust 中做到同样的事情?

目前,我的铁 rust 代码如下所示:

use ndarray::{array, ArrayBase, OwnedRepr, Dim};
use ndarray::linalg::kron;
use num::complex::Complex64 as Complex;



fn X() -> ArrayBase<OwnedRepr<Complex>, Dim<[usize; 2]>> {
    array![
        [Complex::new(0.0, 0.0), Complex::new(1.0, 0.0)],
        [Complex::new(1.0, 0.0), Complex::new(0.0, 0.0)]
    ]
}

fn main() {    
    let mut matrices = Vec::new();
    for _ in 0..8 {
        matrices.push(X());
    }
    let product = matrices
        .iter()
        .reduce(|g1, g2| kron(g1, g2));

}

下面是我得到的误差矩阵:

error

以下是我不明白的事情:

  • OwnedRepr:我不确定这到底是为了什么,但这是Rust 分析师建议我做的
  • I tried to modify my code according to the error message's suggestion, but I got new error message with no further suggestions on how to process.

我想知道如何解决这个问题,如果有任何关于如何使用Rust进行科学计算的初学者级别的示例文件的建议,我将不胜感激.

推荐答案

与Python不同,在Rust中,您需要考虑所有权.

ndarray包括多个版本的数组:ArrayArrayViewArrayViewMutArcArrayCowArray.它们类似于在Rust中查看数据的许多方式:拥有(TBox<T>)-这是ArrayBase<OwnedRepr>的别名Array,共享引用(&T)-ArrayView,可变引用(&mut T)-ArrayViewMut,共享所有权(Rc<T>Arc<T>)-ArcArray,以及写入时复制(Cow<T>)-CowArray.

iter()给你一个遍历元素引用的迭代器,也就是&Array,而kron()返回拥有的数组- Array.但是reduce()要求输入和输出都是相同的类型,因为输出将成为下一项的输入.所以你需要统一它们.

有多种方法可以做到这一点.例如,使用into_iter()而不是iter():

let product = matrices.into_iter().reduce(|g1, g2| kron(&g1, &g2));

或者克隆第一个矩阵并使用fold():

fn kron_many(matrices: &[Array2<Complex>]) -> Option<Array2<Complex>> {
    let (first, rest) = matrices.split_first()?;
    let first = first.clone();
    Some(rest.iter().fold(first, |g1, g2| kron(&g1, g2)))
}

fn main() {
    let mut matrices = Vec::new();
    for _ in 0..8 {
        matrices.push(X());
    }
    let product = kron_many(&matrices);
}

或者不进行克隆,使用CowArray表示可能拥有的数组:

let product = matrices
    .iter()
    .map(|matrix| CowArray::from(matrix))
    .reduce(|g1, g2| kron(&g1, &g2).into());

Rust相关问答推荐

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

亚性状上位性状上的 rust 病伴生型界限

为什么实例方法可以像Rust中的静态方法一样被调用?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

制作一片连续整数的惯用Rust 方法?

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

什么是`&;[][..]`铁 rust 里的刻薄?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

我什么时候应该使用特征作为 Rust 的类型?

rust tokio::spawn 在 mutexguard 之后等待

Rust 中 `Option` 的内存开销不是常量

在 Rust 中为泛型 struct 编写一次特征绑定

制作嵌套迭代器的迭代器

Iterator::collect如何进行转换?

BigUint 二进制补码

如何创建动态创建值并向它们返回borrow 的工厂?

Rust 生命周期:不能在方法内重新borrow 可变字段

在 Rust 中组合特征的不同方法是否等效?

为什么 `ref` 会导致此示例*取消引用*一个字段?