Sou novo no Rust e estou tentando usar o Rust para executar produtos kronecker sequenciais para múltiplas matrizes, ou seja, quero fazer
Em python, eu sei que posso fazer
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)
e obtenha o resultado desejado. Como fazer o mesmo no Rust?
Meu código Rust está parecido com o seguinte por enquanto:
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));
}
Aqui está a matriz de erro que obtive:
Aqui estão as coisas que não entendo:
OwnedRepr
: Não tenho certeza para que serve exatamente, mas foi isso que o analisador de ferrugem me sugeriu fazer- Tentei modificar meu código de acordo com a sugestão da mensagem de erro, mas não obtive mais sugestões de como processar.
Gostaria de saber como consertar isso e agradeceria se houvesse alguma sugestão de arquivos de exemplo de nível iniciante sobre como usar o Rust para fazer cálculos científicos.
Ao contrário do Python, no Rust você deve pensar na propriedade.
ndarray
inclui várias versões de matrizes :Array
,ArrayView
, e . Eles são análogos às muitas maneiras pelas quais podemos visualizar dados no Rust: propriedade ( ou ) - isto é , que é um alias de , referência compartilhada ( ) - , referência mutável ( ) - , propriedade compartilhada ( e ) - e cópia- na gravação ( ) - .ArrayViewMut
ArcArray
CowArray
T
Box<T>
Array
ArrayBase<OwnedRepr>
&T
ArrayView
&mut T
ArrayViewMut
Rc<T>
Arc<T>
ArcArray
Cow<T>
CowArray
iter()
fornece um iterador sobre referências aos elementos, ou seja,&Array
, enquantokron()
retorna matrizes próprias -Array
. Masreduce()
exige que as entradas e a saída sejam do mesmo tipo, porque a saída se torna a entrada do próximo item. Então você precisa unificá-los.Existem várias maneiras de fazer isso. Por exemplo, usando
into_iter()
em vez deiter()
:Ou clonando a primeira matriz e usando
fold()
:Ou sem clonagem, usando
CowArray
para representar um array talvez de propriedade: