MatrixFlow1 0.0.3

MatrixFlow1 0.0.3

Jade Choghari 维护。



MatrixFlow

一个由 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 库的简要指南


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 目标 "链接框架和库" 部分中。


MatrixFlow 使用指南


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]]