You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中对ndarray矩阵的两行执行减法运算?

解决Rust ndarray中视图无法直接相减的编译错误

原代码

use ndarray::Array;

fn main() {
    let random = Array::ones((5, 3));
    println!("{:?}", random);

    let test = random.row(0) - random.row(1);
    println!("{:?}", test);
}

编译错误

error[E0369]: cannot subtract `ArrayBase<ViewRepr<&_>, Dim<[usize; 1]>>` from `ArrayBase<ViewRepr<&_>, Dim<[usize; 1]>>`

问题原因

你推测的没错,random.row(0)和random.row(1)返回的是数组行视图(ArrayView),本质是对原数组数据的引用,ndarray并未为两个视图直接实现减法运算符。

解决方案

方案1:将视图转为拥有所有权的数组

通过.to_owned()或.to_array()把视图转换为独立的数组,即可正常执行减法:

use ndarray::Array;

fn main() {
    let random = Array::ones((5, 3));
    println!("{:?}", random);

    let test = random.row(0).to_owned() - random.row(1).to_owned();
    println!("{:?}", test);
}

这种方式简单直接,但会复制原数组对应行的数据,适合小型数组场景。

方案2:用Zip宏逐元素计算(避免复制)

如果想避免数据复制,可使用ndarray的Zip宏逐元素执行减法并生成新数组,适合处理大数组:

use ndarray::{Array, Zip};

fn main() {
    let random = Array::ones((5, 3));
    println!("{:?}", random);

    let row0 = random.row(0);
    let row1 = random.row(1);
    
    let test = Zip::from(&row0)
        .and(&row1)
        .map(|a, b| a - b)
        .collect::<Array<_,_>>();
    
    println!("{:?}", test);
}

内容的提问来源于stack exchange,提问作者HAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:22:40