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

如何用同尺寸SVector替换大SVector区段?fixed_rows_mut赋值失败原因?

替换SVector区段的赋值问题

问题描述

需要用SVector<f64, 10>存储数据,在循环中用SVector<f64, 2>替换该向量中长度为2的区段,尝试代码如下:

let a = SVector::<f64, 10>::default();

for i in 0..5 {
    let newvec = SVector::<f64, 2>::new(1.0, 2.0); 

    a.fixed_rows_mut::<2>(2 * i) = newvec; // 编译报错
}

编译报错信息:

error[E0070]: invalid left-hand side of assignment
 --> src/main.rs:9:38
  |
9 |         a.fixed_rows_mut::<2>(2 * i) = newvec;
  |         ---------------------------- ^
  |         |
  |         cannot assign to this expression

For more information about this error, try `rustc --explain E0070`.
error: could not compile `playground` (bin "playground") due to previous error

错误原因

  1. fixed_rows_mut::<2>(idx)返回的是MutFixedRows视图类型,它不是可直接赋值的左值,Rust不允许直接对方法返回值做赋值操作,需通过视图提供的方法完成数据复制。
  2. 原代码中a是不可变绑定(let a),即使语法正确也无法修改,必须声明为可变绑定。

解决方案

方法1:使用assign方法

MutFixedRows实现了匹配维度的Assign<SVector> trait,可直接调用assign完成数据复制:

use nalgebra::SVector;

fn main() {
    let mut a = SVector::<f64, 10>::default();

    for i in 0..5 {
        let newvec = SVector::<f64, 2>::new(1.0, 2.0);
        a.fixed_rows_mut::<2>(2 * i).assign(newvec);
    }

    println!("{a}");
}

方法2:使用copy_from_slice方法

将SVector转为切片,通过通用切片复制方法完成替换:

use nalgebra::SVector;

fn main() {
    let mut a = SVector::<f64, 10>::default();

    for i in 0..5 {
        let newvec = SVector::<f64, 2>::new(1.0, 2.0);
        a.fixed_rows_mut::<2>(2 * i).copy_from_slice(newvec.as_slice());
    }

    println!("{a}");
}

两种方法均能实现区段替换,assign更适配SVector场景,copy_from_slice是通用的切片复制方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:17