【发布时间】:2021-07-12 18:57:02
【问题描述】:
我正在尝试通过从na::Matrix3 的前两行复制来创建na::Matrix2x3。结果将存储在结构中。
我不知道该怎么做,文档也很混乱。我尝试了clone()、into()、from(...) 等,但似乎没有任何效果。
这是我尝试使用.clone() (playground) 的可重现示例:
extern crate nalgebra as na; // 0.27.1
fn main() {
let proj33 = na::Matrix3::<f64>::zeros();
let proj: na::Matrix2x3<f64> = proj33.rows(0, 2).clone();
}
error[E0308]: mismatched types
--> src/main.rs:5:36
|
5 | let proj: na::Matrix2x3<f64> = proj33.rows(0, 2).clone();
| ------------------ ^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Const`, found struct `Dynamic`
| |
| expected due to this
|
= note: expected struct `Matrix<_, Const<2_usize>, _, ArrayStorage<f64, 2_usize, 3_usize>>`
found struct `Matrix<_, Dynamic, _, SliceStorage<'_, f64, Dynamic, Const<3_usize>, Const<1_usize>, Const<3_usize>>>`
这似乎可行,但它首先将矩阵初始化为零是浪费:
let mut proj = na::Matrix2x3::<f64>::zeros();
proj.copy_from(&proj33.rows(0, 2));
在 Eigen (C++) 中我会这样做:
const Eigen::Matrix<double, 2, 3> proj = proj33.topRows(2);
【问题讨论】:
-
很浪费——你确定它很浪费而且没有优化吗?
-
即使它已经被优化了,如果事实证明
nalgebra确实有一些构造方法可以在一行中完成,那么拥有一个不必要的mut是冗长和危险的. -
dangerous 似乎有点反应过度了。另见What does 'let x = x' do in Rust?
-
我的意思是危险的,因为额外的复杂性使得程序员在处理那段代码时更容易出错。想象一下,如果 Rust 不允许您分配整数,而您必须使用
let mut a = 0; a.copy(123); let a = a;而不是let a = 123;。然后,当询问是否有更好的方法来做到这一点时,人们会说,“啊,但它是安全的,并且可能已经被编译器优化了”。当然可以,但是后一种方法更难理解,并且如果您必须每次都这样做,则导致错误的可能性更大。