gpt4 book ai didi

arrays - 函数同时接受ndarray和float

转载 作者:行者123 更新时间:2023-12-03 11:36:32 25 4
gpt4 key购买 nike

我想写一个函数来计算某些 Material 的折射率与波长的关系。我将ndarray crate 用于数组,类似于Python中的numpy。
目前,该功能是通过以下方式实现的:

fn calc_refractive_index(l: &Array1<f64>) -> Array1<f64> {
fn refractive_index(&self, l: &Array1<f64>) -> Array1<f64> {
let V =
self.A[0] + self.A[1] / (1. + self.A[2] * (self.A[3] * l / self.pitch).mapv(f64::exp));
let W =
self.B[0] + self.B[1] / (1. + self.B[2] * (self.B[3] * l / self.pitch).mapv(f64::exp));
(self.material.refractive_index(&l).powi(2)
- 3. * l.powi(2) / 4. / (consts::PI * self.pitch).powi(2) * (V.powi(2) - W.powi(2)))
.mapv(f64::sqrt)
}
}
实现以下特质以使增强作用更短:
trait Squared<T> {
fn powi(&self, e: i32) -> T;
}

impl Squared<Array1<f64>> for Array1<f64> {
fn powi(&self, e: i32) -> Array1<f64> {
self.mapv(|a| a.powi(e))
}
}
但是,我可能还想仅在一个特定波长下计算折射率,因此我也想接受float64值。在不实现两个单独功能的情况下,实现此目标的最佳方法是什么?
编辑:
该函数使用ndarray的语法进行平方: l.mapv(|x| x.powi(2)),不幸的是,它与float64不同
编辑2:
根据要求,我包括了功能主体。

最佳答案

绝对有可能,尽管它可能比简单地添加另一个功能需要更多的工作。您将需要首先定义两个助手特性,分别为mapvpowi指定Squaredf64(与Array1<f64>相似)操作:

trait PowI {
fn powi(&self, e: i32) -> Self;
}

impl PowI for f64 {
fn powi(&self, e: i32) -> Self {
f64::powi(*self, e)
}
}

impl PowI for Array1<f64> {
fn powi(&self, e: i32) -> Self {
self.mapv(|a| a.powi(e))
}
}

trait MapV {
fn mapv(&self, f: impl FnMut(f64) -> f64) -> Self;
}

impl MapV for f64 {
fn mapv(&self, mut f: impl FnMut(f64) -> f64) -> Self {
f(*self)
}
}

impl MapV for Array1<f64> {
fn mapv(&self, f: impl FnMut(f64) -> f64) -> Self {
Array1::mapv(self, f)
}
}
然后,您可以使折射率计算函数在实现这两个特征的 T类型(即 T: PowI + MapV)上具有通用性。
请注意,您还需要在 T上附加一些界限,以指定可以对其进行添加,划分和乘以 Tf64(我假设这是 self.pitch的类型以及 self.Aself.B数组中的元素)。您可以通过要求 T&'a T甚至 f64实现适当的 AddMulDiv特性来做到这一点。例如,您的实现可能需要除其他许多限制之外还要求 f64: Mul<&'a T, Output=T>T: Div<f64, Output=T>。编译器错误将帮助您准确确定所需的错误。

关于arrays - 函数同时接受ndarray和float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65441120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com