上升是一个数学工具库。它支持向量和矩阵的线性运算以及对高维张量的切片。它依赖于 Accelerate,这是一个利用现代 CPU 中的 SIMD 指令为矩阵数学、数字信号处理和图像处理提供高效函数的框架。
上升是 Surge 的一个分支,Surge 曾一度被放弃。上升支持张量,并对矩阵和数组提供了更好的支持。它提供了一个自定义的 ValueArray
类,作为 Swift 内置的 Array
的替代方案。由于它是一个 class
而不是 struct
,这意味着您可以控制何时以及是否复制它,使内存管理更加明确。这也允许定义 +=
操作符表示加法而不是连接。
tensor.asMatrix(1, 1, 0...4, 0...4)
let result = A * B′
let result = A • B
let conv = convolution(signal: signal, kernel: kernel)
上升同时支持 CocoaPods (pod 'Upsurge'
) 和 Carthage (github "aleph7/Upsurge"
)。对于 macOS 应用,您可以使用 Swift 包管理器通过将适当的描述添加到您的 Package.swift 文件中安装上升。
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/aleph7/Upsurge.git", Version(0,8,.max)),
]
)
上升的所有线性(1 维)运算都可以在符合 LinearType
协议的任何东西上进行执行。Swift 内置的数组和数组切片当然符合 LinearType
协议。但上升还定义了 ValueArray
类来存储值的一维集合。ValueArray
非常类似于 Swift 的 Array
,但它已经优化以减少不必要的内存分配。以下是它们最重要的区别
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)
。这在你需要自己填充数组时非常有用。但如果你希望初始化所有值,你也可以使用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操作时。
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
一个Matrix
块可以通过重复一个1-D "ValueArray
"或2-D "Matrix
" mxn次来形成。
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许可下可用。有关更多信息,请参阅Licence文件。