Upsurge 数学实用程序

网友投稿 1040 2022-10-14

Upsurge 数学实用程序库

Upsurge 数学实用程序库

Upsurge

Upsurge is a math utilities library. It provides support for linear operations on vectors and matrices, and slicing of higher-dimensional tensors. It relies on Accelerate, which is a framework that provides high-performance functions for matrix math, digital signal processing, and image manipulation by harnessing SIMD instructions available in modern CPUs.

Upsurge is a fork of Surge which was abandoned for a while. Upsurge supports tensors and has better support for matrices and arrays. It provides a custom ValueArray class as an alternative to Swift's built-in Array. It being a class instead of a struct means that you can manage when and if it gets copied, making memory management more explicit. This also allows defining the += operator to mean addition instead of concatenation.

Features

Tensor and tensor slicing: tensor.asMatrix(1, 1, 0...4, 0...4) Matrix and matrix operations: let result = A * B′ ValueArrays with explicit copying and numeric operators: let result = A • B Accelerate functions: let conv = convolution(signal: signal, kernel: kernel)

Installation

Upsurge supports both CocoaPods (pod 'Upsurge') and Carthage (github "aleph7/Upsurge").

Usage

Arrays and vector operations

All of Upsurge's linear (1-dimensional) operations can be performed on anything that conforms to LinearType. Swift's built-in arrays and array slices conform to LinearType, of course. But Upsurge also defines the ValueArray class to store a one-dimensional collection of values. ValueArray is very similar to Swift's Array but it is optimized to reduce unnecessary memory allocation. These are the most important differences:

Its instances have a fixed size defined on creation. When you create a ValueArray you can define a capacity var a = ValueArray(capacity: 100) and then append elements up to that capacity. Or you can create it with specific elements var a: ValueArray = [1.0, 2.0, 3.0] but then you can't add any more elements after.It is a class. That means that creating a new variable will only create a reference and modifying the reference will also modify the original. For instance doing var a: ValueArray = [1, 2, 3]; var b = a and then b[0] = 5 will result in a being [5, 2, 3]. If you want to create a copy you need to do var b = ValueArray(a) or var b = a.copy().You can create an uninitialized ValueArray by doing var a = ValueArray(capacity: n) or var a = ValueArray(count: n). This is good for when you are going to fill up the array yourself. But you can also use var a = ValueArray(count: n, repeatedValue: 0.0) if you do want to initialize all the values.

Creating arrays

Create a ValueArray with specific literal elements when you know ahead of time what the contents are, and you don't need to add more elements at a later time:

let a: ValueArray = [1.0, 3.0, 5.0, 7.0]

Create a ValueArray with a capacity and then fill it in when you are loading the contents from an external source or have a very large array:

let a = ValueArray(capacity: 100)for v in intputSource { a.append(v)}

Finally there is a way of initializing both the capacity and the count of a ValueArray. You should rarely need this but it's there for when you are doing operations on existing arrays using low-level APIs that take pointers:

func operation(a: ValueArray) { let N = a.count let b = ValueArray(count: N) // ...}

Vector arithmetic

You can perform operations on ValueArray in an intuitive manner:

let a: ValueArray = [1.0, 3.0, 5.0, 7.0]let b: ValueArray = [2.0, 4.0, 6.0, 8.0]let addition = a + b // [3.0, 7.0, 11.0, 15.0]let product = a • b // 100.0

Matrix operations

import Upsurgelet A = Matrix([ [1, 1], [1, -1]])let C = Matrix([ [3], [1]])// find B such that A*B=Clet B = inv(A) * C // [2.0, 1.0]′// Verify resultlet r = A*B - C // zero

Tensors

The Tensor class makes it easy to manipulate multi-dimensional data. You can easily slice or flatten a tensor to get matrices and vectors that you can operate on.

License

Upsurge is available under the MIT license. See the LICENSE file for more info.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring cloud 配置阿里数据库连接池 druid的示例代码
下一篇:基于SpringBoot生成二维码的几种实现方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~