如何在nalgebra中实现类似Numpy的矩阵与向量按行相乘?
在nalgebra中实现矩阵与向量的逐行广播相乘(仿Numpy行为)
需求回顾
需要实现类似Numpy中矩阵与向量的广播乘法:3×3单位矩阵与长度为3的向量相乘后,每行元素与向量对应位置元素逐点相乘,得到对角元素为向量值的矩阵。
可行解决方案
无需将向量转换为矩阵,以下两种方式可直接实现需求:
方法1:行迭代构造结果矩阵
利用矩阵的row_iter()方法遍历每一行,对每行与向量执行component_mul(逐元素相乘),最后将结果行组合为新矩阵:
use nalgebra::{Matrix3, Vector3}; fn main() { let m = Matrix3::identity(); let v = Vector3::new(1, 2, 3); let result = Matrix3::from_rows( m.row_iter() .map(|row| row.component_mul(&v)) .collect::<Vec<_>>() .as_slice() ); println!("{}", result); }
方法2:元素映射结合列索引
通过矩阵的map方法,结合元素的列索引直接取向量对应值相乘,代码更简洁:
use nalgebra::{Matrix3, Vector3}; fn main() { let m = Matrix3::identity(); let v = Vector3::new(1, 2, 3); let result = m.map(|val, (_, col_idx)| val * v[col_idx]); println!("{}", result); }
为什么之前的尝试无效
dot方法计算的是标准矩阵-向量点积,输出为向量,而非逐元素相乘的矩阵- 直接使用
*运算符时,nalgebra未定义矩阵与向量的广播乘法,因此类型不匹配无法执行 component_mul要求两个操作数的形状和元素数量完全一致,矩阵与向量不满足该条件
内容的提问来源于stack exchange,提问作者Nil
相关产品推荐
相关产品推荐

