当我尝试从 argmin 板条箱初始化 Nelder Mead 结构时,出现错误。
这是我的代码:
use argmin::solver::neldermead::NelderMead;
fn example() {
let vec_of_parameters = vec![
vec![1.0],
vec![2.0],
];
let nm = NelderMead::new(vec_of_parameters);
}
这会返回错误
the trait argmin_math::ArgminAdd<Vec<{float}>, Vec<{float}>> is not implemented for Vec<{float}>.
我还使用 nalgebra::DVector 重复了相同的操作并得到
the trait argmin_math::ArgminAdd<nalgebra::Matrix<{float}, Dyn, Const<1>, VecStorage<{float}, Dyn, Const<1>>>, nalgebra::Matrix<{float}, Dyn, Const<1>, VecStorage<{float}, Dyn, Const<1>>>> is not implemented for nalgebra::Matrix<{float}, Dyn, Const<1>, VecStorage<{float}, Dyn, Const<1>>>
。
我正在使用 argmin 版本 10.0.0 和 ndarray 版本 0.16.1 以及 Rust 1.8.3 - 谢谢
NelderMead::new
的整体形状看起来是正确的,这意味着问题可能出在 {float}
上。在 rustc
的输出中,{float}
表示未确定的浮点类型。在典型情况下,浮点文字要么从上下文获取其类型,要么默认为 f64
。然而,这并不一定在所有情况下都会发生;特别是,在这里,编译器必须在 P
的类型参数
NelderMead
之间做出选择,以实现这些之一:
impl ArgminAdd<Vec<f32>, Vec<f32>> for Vec<f32>
impl ArgminAdd<Vec<f64>, Vec<f64>> for Vec<f64>
并且受特征约束的 Vec<f32>
和
Vec<f64>
之间的选择与
f32
和
f64
之间的选择不同,因此不会发生默认情况。如果我对这个问题的看法是正确的,解决方案是显式指定整个参数向量的类型:
let vec_of_parameters: Vec<Vec<f64>> = vec![
或至少其中一个文字本身:
vec![1.0_f64],
其中任何一个都会将所有 {float}
限制为
f64
并且应该允许您的程序编译。 (我自己没有测试过这个解决方案。)