julia - 可以使用 Julia 类型和多重调度来对用户透明地处理多个坐标系吗?
问题描述
[我正在尝试做的有点类似于 unitful.jl 对单位所做的事情,但我还没有想出一个干净的 Julian 方法来做到这一点。]
我的程序正在处理很多 3D 坐标,但在多个不同的参考框架中。一些计算最好在某些参考系中完成。我希望用户不需要处理转换,但同时不必编写多个版本的函数来处理参考帧的每个组合。一些函数有多个输入,它们可以在不同的参考系中,所以这可能会组合爆炸。
这是我所拥有的简化视图,它有效,但需要每个功能的多个版本。
struct ECEF
v::StaticArrays.SVector{3, Float64}
end
struct GEODETIC
v::StaticArrays.SVector{3, Float64}
end
function mymag(pt::ECEF)
return √sum(pt.v .^2)
end
function mymag(pt::GEODETIC)
return mymag(convert(ECEF,pt))
end
function convert(::Type{ECEF}, pt::GEODETIC)
return ECEF(geodetic_to_ecef(pt.v...))
end
理想情况下,我希望能够像 Unitful.js 一样自动转换内容。谢谢!
解决方案
您可以做的最简单的事情是使用abstract
类型。在您的情况下,代码可能如下所示:
abstract type AbstractPoint3D end
struct ECEF <: AbstractPoint3D
v::StaticArrays.SVector{3, Float64}
end
struct GEODETIC <: AbstractPoint3D
v::StaticArrays.SVector{3, Float64}
end
function convert(::Type{ECEF}, pt::GEODETIC)
return ECEF(geodetic_to_ecef(pt.v...))
end
convert(::Type{ECEF}, pt::ECEF) = pt
function mymag(pt::AbstractPoint3D)
return √sum(convert(ECEF,pt).v .^2)
end
推荐阅读
- postgresql - 使用带有 CDK 的 Postgresql 创建 Aurora 集群
- aws-appsync - 如何在 vtl appsync 解析器中重用/导入代码?
- r - 如何使用列中的值条件拆分数据框?
- android - 如何使用 Firebase ML 套件确定脸型?
- ios - 是否可以通过服务与 MAAS360 进行通信
- laravel - Laravel 雄辩:使用多个 when() 选择多个动态条件
- angular - 错误:超时 - 未在 30000 毫秒内调用异步回调(由 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置)
- mysql - 无法在 Windows 10 中重置 Mysql root 密码
- d3.js - dc.bubbleChart 过滤器上的动态气泡半径
- javascript - 在 react-infinite-scroll-component 中的每个新搜索上替换获取的搜索结果