【发布时间】:2020-12-24 16:50:22
【问题描述】:
我想写一个函数来计算某种材料的折射率作为波长的函数。我对数组使用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: 按照要求,我包含了函数体。
【问题讨论】:
-
您能否更新您的答案以显示该函数的两个版本的实现?此外,单个函数处理这两种情况是否是一项硬性要求,或者您只是想看看这是否可能?
-
@pretzelhammer:我的问题现在包括函数体。单个函数处理这两种情况并不是硬性要求,只是好奇,因为我正试图更熟悉 rust,看看有什么可能。