一个由 Swift 驱动的矩阵和图像操作的 CocoaPods 库,提供无缝集成 CoreML 和 Accelerate 框架,以优化机器学习和数学计算。
MatrixFlow 是一个复杂的 Swift 库,它利用了 CoreML 和 Accelerate 框架的力量。它的主要目的是为矩阵操作、图像处理、机器学习处理等复杂挑战提供用户友好的解决方案。
Accelerate 框架提供了对现代 CPU 内置的 SIMD 指令的访问,这反过来显著提高了某些计算任务的性能。遗憾的是,由于其有些神秘的本质和不够直观的 API,许多开发者避开了 Accelerate 框架。这种疏忽很遗憾,考虑到许多应用程序通过其集成可能会获得性能提升。
MatrixFlow 有策略地弥补了这一差距。它通过 mlmultiarray 简化了与矩阵操作相关的复杂性,为开发者提供了一个直观的界面来执行 Python 风格的函数,例如
MatrixFlow 内部函数与其类似 Python 函数(特别是与常用于 Python 中矩阵操作的 numpy
库)之间的比较表。
Swift 函数 | Python (numpy) 等效 | 数学表示 |
---|---|---|
ConvertMultiArrayToArray4d | numpy.asarray() (缩放形状) |
|
MultiplyMatrices | numpy.dot() |
|
ReshapeToMatrix | numpy.reshape() |
|
SigmoidMatrix | def sigmoid(x):return 1 / (1 + np.exp(-x)) |
|
ConvertMultiArrayToArray | numpy.asarray() (缩放形状) |
|
Transpose | numpy.transpose() |
|
ReshapeArray | numpy.reshape() |
|
Slice | matrix[:5] |
|
CombineMatrix | numpy.hstack() |
其巨大的潜力使其成为游戏、机器学习开发等不同应用的宝贵资产,所有这些都在 Swift 生态系统内。
目标受众:寻求流线式解决方案以操纵多数组矩阵并处理 CoreML 输出的个人。
此外,以下是使用不同包管理器安装 MatrixFlow
库的简要指南
1. Swift Package Manager
要使用 Swift Package Manager 将 MatrixFlow
集成到您的 Xcode 项目中,将以下内容作为依赖项添加到您的 Package.swift
dependencies: [
.package(url: "https://github.com/jadechoghari/MatrixFlow.git", .upToNextMajor(from: "1.0.0"))
]
然后,只需在需要的地方导入 MatrixFlow
。
2. CocoaPods
首先,确保已安装 CocoaPods。如果没有,请使用以下命令安装它
$ gem install cocoapods
然后,在您的项目目录中创建(如果没有)一个 Podfile
,并添加
pod 'MatrixFlow'
现在,运行以下命令
$ pod install
安装后,请确保打开您的项目 .xcworkspace
。
3. Carthage
确保已安装 Carthage。如果没有,您可以通过 Homebrew 获取它
$ brew install carthage
然后,在您的项目目录中创建(如果没有)一个 Cartfile
,并添加
github "jadechoghari/MatrixFlow"
现在,执行以下操作
$ carthage update
完成后,将生成的 .framework
二进制文件添加到 Xcode 目标 "链接框架和库" 部分中。
1. ConvertMultiArrayToArray4d
此函数无缝地将一个4D MLMultiArray
转换为适用于即时应用的4D矩阵结构。生成的矩阵类型为 [[[[Decimal]]]]
,利用Decimal类型确保数据表示的精度。
用法
import MatrixFlow
// Generating a 4D MLMultiArray
guard let multiArray = try? MLMultiArray(shape: shape, dataType: .float32) else {
fatalError("Failed to create MLMultiArray")
}
// Populate the MLMultiArray with some values
for i in 0..<shape[0].intValue {
for j in 0..<shape[1].intValue {
for k in 0..<shape[2].intValue {
for l in 0..<shape[3].intValue {
let indices = [i, j, k, l] as [NSNumber]
multiArray[indices] = NSNumber(value: i + j + k + l)
}
}
}
}
let fourArray = MatrixFlow.convertMultiArrayToArray4d(multiArray)
期望结果类型
[[[[0, 1], [1, 2], [2, 3], [3, 4]], [[1, 2], [2, 3], [3, 4], [4, 5]], [[2, 3], [3, 4], [4, 5], [5, 6]]]]
//of type [[[[Decimal]]]]
2. MultiplyMatrices
该函数接受两个二维矩阵并执行矩阵乘法。例如,一个(2,4)矩阵乘以一个(4,8)矩阵。
用法
import MatrixFlow
let matrixA: [[Decimal]] = [[1, 2, 3], [4, 5, 6]]
let matrixB: [[Decimal]] = [[7, 8], [9, 10], [11, 12]]
//Perform multiplication
let result = MatrixFlow.multiplyMatrices(matrixAA, matrixBB)
//expected results of type [[Decimal]]: [[58, 64], [139, 154]]
3. ReshapeToMatrix
此函数接受一个二维矩阵并将其重塑,实际上将其维度减半。例如,它可以将一个(3,25600)矩阵转换为(3,160,160)结构。
import MatrixFlow
let flattenedArray: [Decimal] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
let rows = 5
let columns = 5
// specifiy the number of rows and columns you'll need accordingly
let result = MatrixFlow.reshapeToMatrix(array: flattenedArray, rows: rows, cols: columns)
//expected result of type [[Decimal]]
// [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
4. SigmoidMatrix
为此类型为 [[Decimal]]
的矩阵的每个单元格实现sigmoid激活函数。
用法
import MatrixFlow
let matrix: [[Decimal]] = [
[1.8, 2.0, 3.0],
[4.9, 5.0, 6.0],
[7.0, 8.0, 9.0]
]
let result: [[Decimal]] = MatrixFlow.sigmoidMatrix(matrix)
//expected result: [[Decimal]] = [[0.8581489350995122176, 0.880797077977882624, 0.9525741268224335872], [0.9926084586557181952, 0.9933071490757152768, 0.9975273768433655808], [0.9990889488055998464, 0.9996646498695335936, 0.9998766054240137216]]
5. ConvertMultiArrayToArray
此函数旨在将具有三个维度的 MLMultiArray
转换为可用于的3D矩阵。
用法
import MatrixFlow
let shape: [NSNumber] = [1, 3, 4]
guard let multiArray = try? MLMultiArray(shape: shape, dataType: .float32) else {
fatalError("Failed to create MLMultiArray")
}
// Populate the MLMultiArray
for i in 0..<shape[0].intValue {
for j in 0..<shape[1].intValue {
for k in 0..<shape[2].intValue {
let indices = [i, j, k] as [NSNumber]
multiArray[indices] = NSNumber(value: i + j + k)
}
}
}
let result: [[[Decimal]]] = MatrixFlow.convertMultiArrayToArray(multiArray)
// expected result: [[[Decimal]]] = [[[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]]]
6. Transpose
此函数执行二维矩阵的转置,本质上交换其行和列。
用法
import MatrixFlow
let array: [[Decimal]] = [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]]
let result = MatrixFlow.transpose(array)
//expected result: [[Decimal]] = [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]]
7. ReshapeArray
此函数通过合并其最后两个维度来重塑3D矩阵。
用法
import MatrixFlow
let array: [[[Decimal]]] = [[[1.1, 1.2], [1.3, 1.4], [1.5, 1.6], [1.7, 1.8]], [[2.1, 2.2], [2.3, 2.4], [2.5, 2.6], [2.7, 2.8]], [[3.1, 3.2], [3.3, 3.4], [3.5, 3.6], [3.7, 3.8]]]
let result = MatrixFlow.reshapeArray(inputArray: array)
//expected result: [[Decimal]] = [[1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8], [2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8], [3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8]]
8. Slice
此功能执行矩阵切片。给定一个矩阵,它检索前五行。
用法
import MatrixFlow
let input: [[Decimal]] = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 15], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 16]]
//Specify the start and end index of the slicing
let start = 0
let end = 5
let result = MatrixFlow.slice(inputArray: input, start: 0, end: 5)
//expected result: [[Decimal]] = [[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]]
9. CombineMatrix
此函数类似于numpy的 hstack
操作。它水平堆叠两个矩阵。
用法
import MatrixFlow
// boxes and masks are named for illustration purposes
let arrayA: [[Decimal]] = [[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]]
let arrayB: [[Decimal]] = [[6, 7, 8, 9, 10, 50], [16, 17, 18, 19, 20, 15], [26, 27, 28, 29, 30, 16]]
let result = MatrixFlow.combineMatrix(boxes: arrayA, masks: arrayB)
//expected results: [[Decimal]] = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 15], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 16]]