Surge

Build Status License CocoaPods platforms CocoaPods compatible Carthage compatible Swift Package Manager compatible

Surge 是一个 Swift 库,它使用 Accelerate 框架为矩阵数学、数字信号处理和图像处理提供高性能函数。

Accelerate 公开了现代 CPU 中可用的 SIMD 指令,以显著提高某些计算的性能。由于其相对冷门和 API 不便,Accelerate 并没有被开发者广泛使用,这很可惜,因为许多应用程序可以从这些性能优化中受益。

Surge 旨在将 Accelerate 带入主流,使其像处理单个成员一样轻松(并且在大多数情况下几乎一样快)地对一组数字执行计算。

但是,请记住:Accelerate 并非万能药。在某些情况下,例如对小数据集执行简单计算时,Accelerate 的性能可能不如传统算法。始终进行基准测试以确定每种潜在方法的性能特征。


好奇 Surge 这个名字吗?(还有 Jounce?)早在 90 年代中期,Apple、IBM 和 Motorola 联手创建了 AltiVec(又名 Velocity Engine),它为 PowerPC 架构提供了一组 SIMD 指令集。当 Apple 转向 Intel CPU 时,AltiVec 被移植到 x86 架构并更名为 Accelerate。Accelerate 的导数(以及 Velocity 的二阶导数)被称为 加加速度、急动、surge 或 猛冲;如果你对 surge 求导,你会得到 jounce --- 这就是这个库及其母公司组织名称的由来。


安装

在 Swift 和 Xcode 的 beta 测试期间,用于分发 Swift 库的基础设施和最佳实践目前尚不稳定。在此期间,您可以将 Surge 添加为 git 子模块,将 Surge.xcodeproj 文件拖到您的 Xcode 项目中,并将 Surge.framework 添加为您目标的依赖项。

Surge 使用 Swift 5。这意味着由于当前的二进制兼容性限制,您的代码必须使用 Swift 5 编写。

许可证

Surge 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。

Swift Package Manager

要使用 Swift Package Manager,请将 Surge 添加到您的 Package.swift 文件中

let package = Package(
    name: "myproject",
    dependencies: [
        .package(url: "https://github.com/Jounce/Surge.git", .upToNextMajor(from: "2.3.2")),
    ],
    targets: [
        .target(
            name: "myproject",
            dependencies: ["Surge"]),
    ]
)

然后运行 swift build

CocoaPods

要使用 CocoaPods,请将 Surge 添加到您的 Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'Surge', '~> 2.3.2'
end

然后运行 pod install

Carthage

要使用 Carthage,请将 Surge 添加到您的 Cartfile

github "Jounce/Surge" ~> 2.3.2

然后运行 carthage update 并在 Carthage/Build/<platform> 中使用该框架。


用法

计算 [Double] 的总和

import Surge

let n = [1.0, 2.0, 3.0, 4.0, 5.0]
let sum = Surge.sum(n) // 15.0

计算两个 [Double] 的乘积

import Surge

let a = [1.0, 3.0, 5.0, 7.0]
let b = [2.0, 4.0, 6.0, 8.0]

let product = Surge.elmul(a, b) // [2.0, 12.0, 30.0, 56.0]

清单

通用算术运算

加法

加法函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) add .+(中缀) .+=(中缀)
(数组,标量) add +(中缀) +=(中缀)
(矩阵,矩阵) add +(中缀) +=(中缀)
(矩阵,标量) 不适用 不适用 不适用
(向量,向量) add +(中缀) +=(中缀)
(向量,标量) add +(中缀) +=(中缀)

减法

减法函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) sub .-(中缀) .-=(中缀)
(数组,标量) sub -(中缀) -=(中缀)
(矩阵,矩阵) sub -(中缀) -=(中缀)
(矩阵,标量) 不适用 不适用 不适用
(向量,向量) sub -(中缀) -=(中缀)
(向量,标量) sub -(中缀) -=(中缀)

乘法

乘法函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) mul .*(中缀) .*=(中缀)
(数组,标量) mul *(中缀) *=(中缀)
(矩阵,矩阵) mul *(中缀) 不适用
(矩阵,向量) mul *(中缀) 不适用
(矩阵,标量) mul *(中缀) 不适用
(向量,矩阵) mul *(中缀) 不适用
(向量,标量) mul *(中缀) *=(中缀)
(标量,数组) mul *(中缀) 不适用
(标量,矩阵) mul *(中缀) 不适用
(标量,向量) mul *(中缀) 不适用

逐元素乘法

逐元素乘法函数和运算符
参数 函数 运算符 原地运算符
(矩阵,矩阵) elmul 不适用 不适用
(向量,向量) elmul .*(中缀) .*=(中缀)

除法

除法函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) div ./(中缀) ./=(中缀)
(数组,标量) div /(中缀) /=(中缀)
(矩阵,矩阵) div /(中缀) 不适用
(矩阵,标量) 不适用 /(中缀) 不适用
(向量,标量) div /(中缀) /=(中缀)

逐元素除法

逐元素乘法函数和运算符
参数 函数 运算符 原地运算符
(向量,向量) eldiv ./(中缀) ./=(中缀)

取模

取模函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) mod .%(中缀) 不适用
(数组,标量) mod %(中缀) 不适用

求余

求余函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) remainder 不适用 不适用
(数组,标量) remainder 不适用 不适用

平方根

平方根函数和运算符
参数 函数 运算符 原地运算符
(数组) sqrt 不适用 不适用

求和

求和函数和运算符
参数 函数 运算符 原地运算符
(数组) sum 不适用 不适用
(矩阵) sum 不适用 不适用

点积

点积函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) dot (中缀) 不适用
(向量,向量) dot (中缀) 不适用

距离

距离函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) dist 不适用 不适用
(向量,向量) dist 不适用 不适用
平方距离函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) distSq 不适用 不适用
(向量,向量) distSq 不适用 不适用
幂函数和运算符
参数 函数 运算符 原地运算符
(数组,数组) pow .**(中缀) .**=(中缀)
(数组,标量) pow **(中缀) **=(中缀)
(矩阵,标量) pow 不适用 不适用
(向量,向量) pow 不适用 不适用

连续指数运算a ** b ** c == a ** (b ** c)

指数函数和运算符
参数 函数 运算符 原地运算符
(数组) exp 不适用 不适用
(矩阵) exp 不适用 不适用
(向量) exp 不适用 不适用

三角运算

三角函数和运算符
参数 函数 运算
(数组) sin 正弦
(数组) cos 余弦
(数组) tan 正切
(数组) sincos 正弦和余弦
参数 函数 运算
(数组) asin 反正弦
(数组) acos 反余弦
(数组) atan 反正切
参数 函数 运算
(数组) sinh 双曲正弦
(数组) cosh 双曲余弦
(数组) tanh 双曲正切
参数 函数 运算
(数组) asinh 反双曲正弦
(数组) acosh 反双曲余弦
(数组) atanh 反双曲正切
参数 函数 运算
(数组) rad2deg 弧度
(数组) deg2rad 弧度
指数函数和运算符
参数 函数 运算
(数组) exp 以 e 为底的指数函数
(数组) exp2 以 2 为底的指数函数
指数函数和运算符
参数 函数 运算
(数组) log 以 e 为底的对数
(数组) log2 以 2 为底的对数
(数组) log10 以 10 为底的对数
(数组) logb 以 b 为底的对数

统计运算

统计函数和运算符
参数 函数 运算
(数组) sum 求和
(数组) asum 绝对值求和
参数 函数 运算
(数组) min 最小值
(数组) max 最大值
参数 函数 运算
(数组) mean 平均值
(数组) meamg 幅度的平均值
(数组) measq 平方的平均值
(数组) variance 方差
(数组) std 标准差

辅助函数

辅助函数和运算符
参数 函数 运算
(数组) ceil 向上取整
(数组) floor 向下取整
(数组) round 四舍五入
(数组) trunc 整数截断
参数 函数 原地函数 运算符 原地运算符
(数组) abs 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(数组) copysign 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(数组) rec 不适用 不适用 不适用

矩阵特定运算

矩阵特定函数和运算符
参数 函数 原地函数 运算符 原地运算符
(矩阵) inv 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(矩阵) transpose 不适用 (后缀) 不适用
参数 函数 原地函数 运算符 原地运算符
(矩阵) det 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(矩阵) eigenDecompose 不适用 不适用 不适用

DSP 特定运算

快速傅里叶变换函数和运算符
参数 函数 原地函数 运算符 原地运算符
(数组) fft 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(数组,数组) conv 不适用 不适用 不适用
参数 函数 原地函数 运算符 原地运算符
(数组,数组) xcorr 不适用 不适用 不适用
(数组) xcorr 不适用 不适用 不适用