
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,请将 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,请将 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,请将 Surge 添加到您的 Cartfile 中
github "Jounce/Surge" ~> 2.3.2
然后运行 carthage update 并在 Carthage/Build/<platform> 中使用该框架。
import Surge
let n = [1.0, 2.0, 3.0, 4.0, 5.0]
let sum = Surge.sum(n) // 15.0
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 |
标准差 |
辅助函数和运算符
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组) |
abs |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组) |
copysign |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组) |
rec |
不适用 |
不适用 |
不适用 |
矩阵特定函数和运算符
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(矩阵) |
inv |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(矩阵) |
transpose |
不适用 |
′(后缀) |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(矩阵) |
det |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(矩阵) |
eigenDecompose |
不适用 |
不适用 |
不适用 |
快速傅里叶变换函数和运算符
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组) |
fft |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组,数组) |
conv |
不适用 |
不适用 |
不适用 |
| 参数 |
函数 |
原地函数 |
运算符 |
原地运算符 |
(数组,数组) |
xcorr |
不适用 |
不适用 |
不适用 |
(数组) |
xcorr |
不适用 |
不适用 |
不适用 |