Upsurge 实现了多维数据结构和操作。它将类似 numpy 的操作带到 Swift 中。
Upsurge 不再支持 DSP 和其他线性操作,请使用 Surge。Surge 和 Upsurge 可以很好地协同工作。
tensor.asMatrix(1, 1, 0...4, 0...4)
let result = A * B′
let result = A • B
Upsurge 同时支持 CocoaPods (pod 'Upsurge'
) 和 Carthage (github "aleph7/Upsurge"
)。 对于 macOS 应用程序,您可以使用 Swift Package Manager 通过将适当的描述添加到您的 Package.swift 文件来安装 Upsurge。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/aleph7/Upsurge.git", Version(0,8,.max)),
]
)
Upsurge 的所有线性(一维)操作都可以在任何符合 LinearType
的类型上执行。 Swift 的内置数组和数组切片当然符合 LinearType
。 但 Upsurge 还定义了 ValueArray
类来存储一维数值集合。 ValueArray
与 Swift 的 Array
非常相似,但它经过优化以减少不必要的内存分配。 以下是它们之间最重要的区别:
ValueArray
时,您可以定义一个容量 var a = ValueArray<Double>(capacity: 100)
,然后追加最多该容量的元素。 或者,您可以使用特定元素创建它 var a: ValueArray = [1.0, 2.0, 3.0]
,但之后您就无法添加任何更多元素了。var a: ValueArray = [1, 2, 3]; var b = a
然后 b[0] = 5
将导致 a
变为 [5, 2, 3]
。 如果要创建副本,则需要执行 var b = ValueArray(a)
或 var b = a.copy()
。var a = ValueArray<Double>(capacity: n)
或 var a = ValueArray<Doube>(count: n)
来创建一个未初始化的 ValueArray
。 这对于您自己填充数组的情况很有用。 但是,如果您确实想初始化所有值,也可以使用 var a = ValueArray(count: n, repeatedValue: 0.0)
。当您事先知道内容,并且不需要在以后添加更多元素时,请使用特定的字面量元素创建一个 ValueArray
let a: ValueArray = [1.0, 3.0, 5.0, 7.0]
当您从外部源加载内容或拥有一个非常大的数组时,创建一个具有容量的 ValueArray
,然后填充它
let a = ValueArray<Double>(capacity: 100)
for v in intputSource {
a.append(v)
}
最后,有一种方法可以初始化 ValueArray
的容量和计数。 您很少需要这样做,但它适用于您使用低级 API 对现有数组执行操作时(这些 API 采用指针)
func operation(a: ValueArray<Double>) {
let N = a.count
let b = ValueArray<Double>(count: N)
// ...
}
您可以以直观的方式对 ValueArray
执行操作
let a: ValueArray = [1.0, 3.0, 5.0, 7.0]
let b: ValueArray = [2.0, 4.0, 6.0, 8.0]
let addition = a + b // [3.0, 7.0, 11.0, 15.0]
let product = a • b // 100.0
import Upsurge
let A = Matrix<Double>([
[1, 1],
[1, -1]
])
let C = Matrix<Double>([
[3],
[1]
])
// find B such that A*B=C
let B = inv(A) * C // [2.0, 1.0]′
// Verify result
let r = A*B - C // zero
可以通过重复一个一维 ValueArray
或二维 Matrix
mxn 次来形成一个块 Matrix
。
import Upsurge
let a = ValueArray = [1.0, 2.0]
// Tile source array 2 times in each directon,
// returning a 2X4 block matrix
let A = a.tile(2, 2)
let B = Matrix<Double>([
[1.0, 2.0],
[3.0, 4.0]
)]
// Tile source matrix 2 times in each directon,
// returning a 4x4 block matrix
let r = B.tile(2, 2)
Tensor
类可以轻松地操作多维数据。 您可以轻松地对张量进行切片或展平,以获得可以操作的矩阵和向量。
Upsurge 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。