上升 0.10.2

上升 0.10.2

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布最新版本2018年3月
SPM支持 SPM

Alejandro Isaza 维护。



上升 0.10.2

上升

上升是一个数学工具库。它支持向量和矩阵的线性运算以及对高维张量的切片。它依赖于 Accelerate,这是一个利用现代 CPU 中的 SIMD 指令为矩阵数学、数字信号处理和图像处理提供高效函数的框架。

上升是 Surge 的一个分支,Surge 曾一度被放弃。上升支持张量,并对矩阵和数组提供了更好的支持。它提供了一个自定义的 ValueArray 类,作为 Swift 内置的 Array 的替代方案。由于它是一个 class 而不是 struct,这意味着您可以控制何时以及是否复制它,使内存管理更加明确。这也允许定义 += 操作符表示加法而不是连接。

特性

  • [x] 张量和张量切片:tensor.asMatrix(1, 1, 0...4, 0...4)
  • [x] 矩阵和矩阵运算:let result = A * B′
  • [x] 带有显式复制和数值运算符的值数组:let result = A • B
  • [x] Accelerate 函数: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,但它已经优化以减少不必要的内存分配。以下是它们最重要的区别

  • 其实例在创建时具有固定的大小。当你创建一个"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()
  • 你可以通过以下方式创建一个未初始化的"ValueArray":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文件。