首页 > 解决方案 > 如何用ndarray将矩阵乘以视图?

问题描述

使用ndarray。这个操场片段说明了一切——我想将矩阵视图元素与矩阵相乘,但我无法弄清楚视图和强制转换的组合以及其他可以使它工作的东西。

#![allow(unused)]

use ndarray::{Array1, Array2, Axis};

fn main () {
    let bob = Array1::from(vec![1.2, 3.3, 4.]);
    let ralph = Array2::from(vec![[3.3, 1.0, -2.0],[4., 5., 8.], [-9., 2., 1.]]);
    println!("{:?}", ralph.index_axis(Axis(1), 0) * bob);
}

编译时出现错误:

error[E0369]: cannot multiply `ArrayBase<ViewRepr<&{float}>, Dim<[usize; 1]>>` by `ArrayBase<OwnedRepr<{float}>, Dim<[usize; 1]>>`
 --> src/lib.rs:8:51
  |
8 |     println!("{:?}", ralph.index_axis(Axis(1), 0) * bob);
  |                      ---------------------------- ^ --- ArrayBase<OwnedRepr<{float}>, Dim<[usize; 1]>>
  |                      |
  |                      ArrayBase<ViewRepr<&{float}>, Dim<[usize; 1]>>

有没有一种神奇的指环组合可以让它做我想做的事,还是我需要手工做?

标签: multidimensional-arrayrust

解决方案


向乘法的两个元素添加 & 将防止在乘法过程中消耗任何一个值:

&ralph.index_axis(Axis(1), 0) * &bob

ndarray 文档中的以下链接解释了在二进制操作期间分配新数组与使用数组:https ://docs.rs/ndarray/0.14.0/ndarray/struct.ArrayBase.html#binary-operators-with-two-数组

我认为因为 index_axis() 的结果是另一个数组的视图,所以不能安全地使用它,因此出现错误


推荐阅读