nalgebra中SMatrix从迭代器生成行列数不符问题咨询
问题解答
这是对nalgebra矩阵填充逻辑的理解偏差,不是库的问题。
- 你对
SMatrix维度参数的理解没错:SMatrix<f64, 2, 3>确实代表2行3列的矩阵,nalgebra中SMatrix<标量类型, 行数, 列数>的参数顺序是正确的。 - 问题出在
from_iterator的填充规则上:nalgebra默认采用列主序(column-major)存储矩阵,from_iterator会按这个顺序填充元素——先填满第一列,再填第二列,以此类推,而非你预期的行优先顺序。
你的迭代器生成的序列是1.0, 2.0, 3.0, 4.0, 5.0, 6.0,按列主序填充2行3列的矩阵时,元素实际布局为:
行1: 1.0 2.0 5.0 行2: 3.0 4.0 6.0
如果你想要按行优先填充得到预期的2行3列矩阵,可以使用from_row_slice方法,它会按行顺序读取元素:
let m: SMatrix<f64, 2, 3> = SMatrix::from_row_slice(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]); println!("{:?}", m);
这段代码的输出就是你预期的:
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
也可以通过构造行向量再组合成矩阵的方式实现:
use nalgebra::{SMatrix, Vector3}; let row1 = Vector3::new(1.0, 2.0, 3.0); let row2 = Vector3::new(4.0, 5.0, 6.0); let m = SMatrix::from_rows(&[row1, row2]);
内容的提问来源于stack exchange,提问作者rochard4u
相关产品推荐
相关产品推荐

