美文网首页
Swift 实现向量及矩阵基本运算

Swift 实现向量及矩阵基本运算

作者: 周一见丶 | 来源:发表于2020-09-09 22:42 被阅读0次

比如向量点乘、矩阵的逆、高斯消元法等
Github: https://github.com/zhouyijian/LinearAlgebra
向量示例代码

//
//  Vector.swift
//  Vector
//
//  Created by 周一见 on 2020/7/31.
//  Copyright © 2020 周一见. All rights reserved.
//

import Foundation
struct Vector {
    
    let values: [Double]
    
    init(array: [Double]) {
        self.values = array
    }
    
    init(zeroDim: Int) {
        self.init(array: Array.init(repeating: 0, count: zeroDim))
    }
    
    func getLen() -> Int {
        return values.count
    }
    
    func getItem(index: Int) -> Double {
        return values[index]
    }
    
}

precedencegroup DotProductPrecedence {
    lowerThan: AdditionPrecedence
    associativity: left
}

infix operator •: DotProductPrecedence

//MARK: - 规范化
extension Vector {
    func norm() -> Double {
        var sum = 0.0
        for i in self.values {
            sum += (i * i)
        }
        return sum.squareRoot()
    }
    
    func normalize() -> Vector {
        if self.norm() < epsilon {
            fatalError("Can not normalize zero vector")
        } else {
            return self / self.norm()
        }
    }
}

// MARK: - Operators
extension Vector {
    static func + (left: Vector, right: Vector) -> Vector {
        assert(left.getLen() == right.getLen())
        var sum = Array.init(repeating: 0.0, count: left.getLen())
        for i in 0..<sum.count {
            sum[i] = left.getItem(index: i) + right.getItem(index: i)
        }
        return Vector(array: sum)
    }
    
    static func - (left: Vector, right: Vector) -> Vector {
        assert(left.getLen() == right.getLen())
        var sum = Array.init(repeating: 0.0, count: left.getLen())
        for i in 0..<sum.count {
            sum[i] = left.getItem(index: i) - right.getItem(index: i)
        }
        return Vector(array: sum)
    }
    
    static prefix func - (vector: Vector) -> Vector {
        var sum = Array.init(repeating: 0.0, count: vector.getLen())
        for i in 0..<sum.count {
            sum[i] = -vector.getItem(index: i)
        }
        return Vector(array: sum)
    }
    
    static func * (left: Double, right: Vector) -> Vector {
        var sum = Array.init(repeating: 0.0, count: right.getLen())
        for i in 0..<sum.count {
            sum[i] = left * right.getItem(index: i)
        }
        return Vector(array: sum)
    }
    
    //这里用到了上面重载的*运算
    static func * (left: Vector, right: Double) -> Vector {
        return right * left
    }
    
    static func / (left: Vector, right: Double) -> Vector {
        return left * (1 / right)
    }
    
    static func • (left: Vector, right: Vector) -> Double {
        assert(left.getLen() == right.getLen())
        var sum = 0.0
        for i in 0..<left.getLen() {
            sum += left.getItem(index: i) * right.getItem(index: i)
        }
        return sum
    }
}

extension Vector: Equatable {
    static func == (left: Vector, right: Vector) -> Bool {
        assert(left.getLen() == right.getLen())
        for i in 0..<left.getLen() {
            if left.getItem(index: i) != right.getItem(index: i) {
                return false
            }
        }
        return true
    }
}

extension Vector: CustomStringConvertible {
    var description: String {
        var des = "("
        for (index, e) in values.enumerated() {
            if index == values.count - 1 {
                des += "\(e)"
            } else {
                des += "\(e), "
            }
        }
        des += ")"
        return des
    }

}


相关文章

  • Swift 实现向量及矩阵基本运算

    比如向量点乘、矩阵的逆、高斯消元法等Github: https://github.com/zhouyijian/L...

  • Octave基础教程

    一、基本操作 数学运算与逻辑运算 数学运算 逻辑运算 向量与矩阵 矩阵 向量 注:构造过程中用“;”分隔,不要用成...

  • 矩阵和向量

    概述 本文主要讲解矩阵和向量的基础数学知识,我们的目标是能掌握基本的运算操作即可。 矩阵 向量 矩阵运算 矩阵与向...

  • DL01-4:感知器实现(向量版)

    1.使用numpy做内积运算2.使用向量或者矩阵内积实现感知器 一、向量与矩阵的内积计算 1、向量作为矩阵的注意点...

  • 2019-07-28[R语言编程艺术-2]

    chapter3 向量 矩阵的运算和索引:类似向量 矩阵筛选 对矩阵行列调用函数 apply(), tapply(...

  • 第三节矩阵运算

    1矩阵运算 2矩阵运算 3向量和矩阵的运算 4矩阵的逆 逆矩阵与原矩阵相乘得到单位矩阵,对角线全为1,其他元素为0...

  • iOS 向量运算

    整理了几个swift向量运算的方法

  • Machine Learning 学习笔记-复习线性代数

    矩阵 一个由m行n列元素排列成的矩形阵列 向量 n*1 的矩阵 矩阵基础运算 矩阵与向量的乘法 m*n 的矩阵 和...

  • 【深度学习-数学基础】矩阵和向量相乘结果

    矩阵和向量相乘结果 一个 m 行 n 列的矩阵和 n 行向量相乘,最后得到就是一个 m 行的向量。运算法则就是矩阵...

  • 3-8 Numpy中的聚合运算

    1.聚合运算 1)向量上的聚合运算 2)二维矩阵上的聚合运算

网友评论

      本文标题:Swift 实现向量及矩阵基本运算

      本文链接:https://www.haomeiwen.com/subject/bwoyektx.html