Rust argmin:初始化 NelderMead 结构时出现问题(argmin::solver::neldermead::NelderMead)

问题描述 投票:0回答:1

当我尝试从 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 - 谢谢

rust optimization
1个回答
0
投票

您输入到

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
 并且应该允许您的程序编译。 (我自己没有测试过这个解决方案。)

© www.soinside.com 2019 - 2024. All rights reserved.