Upsurge

Upsurge 实现了多维数据结构和操作。它将类似 numpy 的操作带到 Swift 中。

Upsurge 不再支持 DSP 和其他线性操作,请使用 Surge。Surge 和 Upsurge 可以很好地协同工作。

特性

安装

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

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 文件。