Swift 硬件加速的矩阵/数值编程库。
let frumb: Matrix<Double> = .random(shape: .square(length: 4), in: -1.0...1.0)
let brumf = frumb <*> frumb.transposed()
只需将 Plinth 添加到您的 Package.swift
文件中
let package = Package(
name: "Example",
dependencies: [
.package(url: "https://github.com/dclelland/Plinth.git", from: "2.0.0"),
],
targets: [
.target(name: "Example", dependencies: ["Plinth"])
]
)
然后将 Plinth 导入到您的 Swift 文件中
import Plinth
或者,为了完全支持 ComplexMatrix
,您还应该导入 swift-numerics
,因为 Complex
类型存在于其中。
import Plinth
import Numerics
swift-numerics
添加 ShapedArray
类型的讨论).zeros
和 .ones
初始化器vDSP.fill
、vDSP.clear
、vDSP.window
、vDSP.ramp
、vDSP.stereoRamp
的包装器vDSP.convolve
的包装器Eigendecomposition.sorted
,按实部或幅度对特征值进行排序哪个更好?swift-numerics
仅支持 SPM。也许我应该制作自己的 Complex
类型。Plinth 的理念是做“能工作的最简单的事情”。例如,许多算术/数值函数都实现了两次 - 针对 Matrix<Float>
和 Matrix<Double>
- 而不是通过协议和协议实现的沼泽来管理它,我们只需使用复制和粘贴来实现给定的函数两次。 Plinth 不是 DRY(不要重复自己)。
使用 rows
和 columns
属性定义矩阵的形状。
public struct Shape {
public let rows: Int
public let columns: Int
}
这包括许多方便的属性,如 count
、length
和 breadth
;以及方便的初始化器 .row(length:)
、.column(length:)
和 .square(length:)
。
具有 Scalar
类型参数以及 shape
和 elements
属性的泛型矩阵结构体。元素以行优先格式存储为单个数组。
public struct Matrix<Scalar> {
public let shape: Shape
public var elements: [Scalar]
}
这还包括大量的便利初始化器和典型类型类的实现,例如 Codable
和 ExpressibleByArrayLiteral
。
elements
属性是直接可变的,但理想情况下应该避免;除非在编码到或解码自序列化格式时,否则不会强制执行矩阵规则性。
存在一个计算属性 state
,可用于检查矩阵是否被认为是畸形的
let malformed = Matrix<Double>(
shape: .init(rows: 2, columns: 2),
elements: [1.0, 2.0, 3.0, 4.0, 5.0]
)
print(malformed.state)
> Malformed: Mismatched shape and elements; 2×2 != 5
泛型复数矩阵结构体,封装了 real
和 imaginary
部分的两个单独的矩阵。
public struct ComplexMatrix<Scalar> where Scalar: Real {
public var real: Matrix<Scalar>
public var imaginary: Matrix<Scalar>
}
这还包括大量的便利初始化器和典型类型类的实现,例如 Codable
和 ExpressibleByArrayLiteral
。
real
和 imaginary
属性也是直接可变的; ComplexMatrix
具有自己的 state
属性,可用于检查各个部分是否不匹配或畸形。
+
和 -
前缀运算符以及 +
、-
、*
、/
中缀运算符。
为 Scalar
、Complex<Scalar>
、Matrix<Scalar>
和 ComplexMatrix<Scalar>
的组合实现快速逐点算术,其中 Scalar
是 Float
或 Double
。
整数类型 UInt8
、UInt16
、UInt32
、Int8
、Int16
、Int32
和浮点类型 Float
和 Double
之间的快速类型转换。
用于对矩阵元素进行形状保留操作的高阶函数。
包括对 DSPSplitComplex
/DSPDoubleSplitComplex
的复数矩阵运算的支持。
免责声明:这些不是真正的函子,Swift 缺少高阶类型...
使用 Swift 下标界面进行快速子矩阵读/写访问。
使用 Accelerate 的
vDSP_mmov
/vDSP_mmovD
。
Accelerate 中大多数基本 vDSP
和 vForce
函数的包装器。
给定舍入规则,找到矩阵的中心点。
给定舍入规则,将矩阵向中心裁剪。
给定舍入规则,从中心向外零填充矩阵。
将新形状应用于矩阵,或将其重塑为单行或单列。
这也支持 .rowMajor
和 .columnMajor
排序。
将循环移位应用于矩阵。
按行或按列将多个矩阵连接在一起。
<
, <=
, >
, >=
, ==
, !==
中缀运算符。
逐点比较或相等性检查,false
返回 0.0
,true
返回 1.0
。
将值从给定范围线性插值到/从 0.0...1.0
。
这类似于 C++ 的
std::lerp
。
**
中缀运算符。
为 Scalar
和 Matrix
实现快速逐点幂运算。
包括用于计算矩阵整数幂的特殊函数,以便在递归应用 vDSP.multiply
比 vForce.pow
更快时使用(这是一个非常昂贵的操作)。
这也支持负整数,通过将 vForce.reciprocal
应用于结果。
生成从一系列值的开始到结束,沿笛卡尔或极坐标倾斜的矩阵。
使用 Swift 随机数生成器或 LAPACK 函数生成填充有随机噪声的矩阵,以便在设置的分布中更快地生成。
对于实矩阵,使用 LAPACK 的
slarnv_
/dlarnv_
,对于复数矩阵,使用clarnv_
/zlarnv_
。
使用 Swift 随机数生成器生成填充有高斯噪声的矩阵。
这源于 comp.lang.c FAQ 上的一个答案。
计算中心矩和标准化矩; variance
、standardDeviation
、skewness
和 kurtosis
的便利方法。
使用其 minimum()
和 maximum()
值将矩阵标准化为 0.0...1.0
;或者移动它,使其 mean()
居中于零。
生成填充有零的矩阵。
生成填充有 1 的矩阵。
生成单位矩阵。
生成对角矩阵。
转置矩阵。
使用 Accelerate 的
vDSP_mtrans
/vDSP_mtransD
。
计算矩阵的逆矩阵。
对于实矩阵,使用 LAPACK 的
sgetri_
/dgetri_
;对于复数矩阵,使用cgetri_
/zgetri_
。
<*>
中缀运算符。
实现矩阵乘法。
对于实矩阵,使用 Accelerate 的
vDSP_mmul
/vDSP_mmulD
;对于复数矩阵,使用vDSP_zmmul
/vDSP_zmmulD
。
/>
和 </
中缀运算符。
实现左右矩阵除法(乘以矩阵的逆矩阵)。
复数平方根。
公式取自 MATLAB 的
sqrt
函数。
复数指数。
公式取自 MATLAB 的
exp
函数。
内积和外积。
计算矩阵的特征分解。 包括仅计算必要组件的支持。 还包括通过特征值的属性对特征向量进行排序的支持。
通过获取伴随矩阵的特征值来计算多项式的根。
在 0.0...1.0
范围内的浮点格式与在 0...255
范围内的 8 位位图之间的转换。
与 vImage.PixelBuffer
、CGImage
、CIImage
、NSImage
和 UIImage
之间的转换。
正向和反向二维傅里叶变换。
包括对创建、重用和销毁您自己的 FFTSetup
/FFTSetupD
结构的支持。
某些逆傅里叶变换方法通过除以矩阵的大小来实现能量守恒。
使用Accelerate 的
vDSP_fft2d_zip
/vDSP_fft2d_zipD
。
对频域矩阵应用循环旋转,使直流/直流信号位于右下象限的左上方。
生成与二维FFT布局对齐的斜坡,用于屏蔽二维FFT信号。
通过将频谱与其复共轭或幅度相乘,计算矩阵的自相关。
通过对频谱或其幅度求平方,计算矩阵的自卷积。
使用 3x3、5x5 和图像内核计算卷积。