gpt4 book ai didi

arrays - Scala 中结构的快速打包数组

转载 作者:行者123 更新时间:2023-12-01 02:30:36 24 4
gpt4 key购买 nike

我正在研究如何将现有的混合 Python/C++ 数字代码库转变为混合 Scala/C++(从长远来看,理想情况下主要是 Scala)。我预计最大的问题是结构体数组。例如,在 C++ 中,我们有这样的类型

Array<Vector<double,3>> # analogous to double [][3]
Array<Frame<Vector<double,3>>> # a bunch of translation,quaternion pairs

由于 Numpy,这些可以在 Python 和 C++ 之间来回转换而无需复制。

在 JVM 上,由于未装箱的数组只能有少数类型,因此我能想象的唯一方法是为每个结构创建 (1) 一个装箱的 Scala 类型,例如 Vector<double,3> (2) Array[Double] 周围的打字薄 wrapper 它知道它应该是什么结构,并根据需要创建/使用盒装单例。

是否有任何现有的库可以做这样的事情,或者为结构的打包数组实现任何替代方案?有没有人有关于性能特征可能是什么的经验,以及现有的编译器和 JVM 是否能够至少在非多态、密封的情况下优化这些盒子?

请注意,打包和漂亮的输入不是可选的:如果不打包,我会很快耗尽内存,如果我只有 Array[Double] C++ 的类型系统(不幸的是)获胜。

最佳答案

问题真的是那里除了数字之外还有什么。如果只是一堆 double ,你可以用 Scala 写一个包装器,但你不应该指望避免拳击。相反,请考虑编写可变包装器:

trait Vec3 {
def x: Double
def y: Double
def z: Double
}
class ArrayedVec3(array: Array[Double]) extends Vec3 {
private[this] var index = 0
def goto(i: Int) = { index = i*3; this }
def x = array(index)
def y = array(index+1)
def z = array(index+2)
}

你可以让 ArrayedVec3 实现 Iterator ,将自身返回为 next ,或其他各种情况,适用于您想要易用性而不是效率的情况。

但关键是,如果您愿意自己管理这些适配器的创建和移动,则无需担心拳击。您只需创建一次“盒子”,然后它就会跳到您需要的任何地方。

如果您对 C++ 约 2 倍的性能感到满意,并且打算使用单线程,那么这应该可以解决问题。 (它过去对我有用。)

关于arrays - Scala 中结构的快速打包数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226192/

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