Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速矩阵和_Swift_Matrix_Sum - Fatal编程技术网

Swift 快速矩阵和

Swift 快速矩阵和,swift,matrix,sum,Swift,Matrix,Sum,我正在尝试开发一个func函数,如果两个矩阵等于相同的维数,它允许两个矩阵求和,但是我在尝试中得到一个错误“EXC_BAD_指令” 这是我的游乐场: import Foundation enum RisedError: ErrorType { case DimensionNotEquals case Obvious(String) } func ==(lhs: Matrix, rhs: Matrix) -> Bool { return (lhs.rows) ==

我正在尝试开发一个func函数,如果两个矩阵等于相同的维数,它允许两个矩阵求和,但是我在尝试中得到一个错误“EXC_BAD_指令”

这是我的游乐场:

import Foundation

enum RisedError: ErrorType {
    case DimensionNotEquals
    case Obvious(String)
}

func ==(lhs: Matrix, rhs: Matrix) -> Bool {
    return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
}

protocol Operation {
    mutating func sumWith(matrixB: Matrix) throws -> Matrix
}

struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(count: rows * columns, repeatedValue: 0.0)
    }
    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValidForRow(row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

var matrixA = Matrix(rows: 2, columns: 2)
matrixA[0,0] = 1.0
matrixA[0,1] = 2.0
matrixA[1,0] = 3.0
matrixA[1,1] = 4.0
var matrixB = Matrix(rows: 2, columns: 2)
matrixB[0,0] = 5.0
matrixB[0,1] = 6.0
matrixB[1,0] = 7.0
matrixB[1,1] = 8.0

print(matrixA)
print(matrixB)

extension Matrix: Operation {

    mutating func sumWith(matrixB: Matrix) throws -> Matrix {

        guard self == matrixB else { throw RisedError.DimensionNotEquals }

        for row in 0...self.rows {
            for column in 0...self.columns {
                self[row, column] = matrixB[row, column] + self[row, column]
            }
        }
        return self
    }
}

do {
    try matrixA.sumWith(matrixB)
} catch RisedError.DimensionNotEquals {
    print("The two matrix's dimensions aren't equals")
} catch {
    print("Something very bad happens")
}
<代码>导入基础 枚举RisedError:ErrorType{ 箱子尺寸 大小写明显(字符串) } func==(左:矩阵,右:矩阵)->Bool{ 返回(左行)==(右行)&(左列)==(右列) } 协议操作{ 变异函数sumWith(matrixB:Matrix)抛出->矩阵 } 结构矩阵{ 让行:Int,列:Int 变量网格:[双精度] init(行:Int,列:Int){ self.rows=行 self.columns=列 网格=数组(计数:行*列,重复值:0.0) } func indexIsValidForRow(行:Int,列:Int)->Bool{ 返回行>=0&&row=0&&columnDouble{ 得到{ 断言(indexIsValidForRow(行、列:列),“索引超出范围”) 返回网格[(行*列)+列] } 设置{ 断言(indexIsValidForRow(行、列:列),“索引超出范围”) 网格[(行*列)+列]=newValue } } } 变量矩阵=矩阵(行:2,列:2) 矩阵[0,0]=1.0 矩阵[0,1]=2.0 矩阵[1,0]=3.0 矩阵[1,1]=4.0 var matrixB=矩阵(行:2,列:2) matrixB[0,0]=5.0 matrixB[0,1]=6.0 matrixB[1,0]=7.0 matrixB[1,1]=8.0 打印(矩阵) 打印(matrixB) 可拓矩阵:运算{ 变异函数sumWith(matrixB:Matrix)抛出->矩阵{ guard self==matrixB else{throw RisedError.DimensionNotEquals} 对于0…self.rows中的行{ 对于0…self.columns中的列{ self[row,column]=matrixB[row,column]+self[row,column] } } 回归自我 } } 做{ 尝试matrixA.sumWith(matrixB) }捕集器冒口错误。尺寸不相等{ 打印(“两个矩阵的尺寸不相等”) }抓住{ 打印(“发生了非常糟糕的事情”) } 以下是错误日志:


问题是您正在使用for循环中的
0…self.rows
。这将包括迭代中范围的上限,在您的情况下,它超出了范围,因此将崩溃


您想使用半开范围运算符
。实际上,您的错误是索引超出范围

用此代码替换扩展名

extension Matrix: Operation {

    mutating func sumWith(matrixB: Matrix) throws -> Matrix {

        guard self == matrixB else { throw RisedError.DimensionNotEquals }

        for row in 0...self.rows - 1 {
            for column in 0...self.columns - 1 {
                self[row, column] = matrixB[row, column] + self[row, column]
            }
         }
        return self
    }
}
希望它能解决您的问题。

swift 4-3 x 3矩阵的加法
swift 4 - Addition 0f 3 x 3 Matrices

enum RisedError: Error {
        case DimensionNotEquals
        case Obvious(String)
    }
    func ==(lhs: Matrix, rhs: Matrix) -> Bool {
        return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
    }
    protocol Operation {
        mutating func sumWith(matrixB: Matrix) throws -> Matrix

    }
    class ViewController: UIViewController {


    //Matrix creation
        func matrixCreation(){
            var matrixA = Matrix(rows: 3, columns: 3)
            var matrixB = Matrix(rows: 3, columns: 3)
            matrixA[0,0] = 1.0
            matrixA[0, 1] = 2.0
            matrixA[0, 2] = 2.0
            matrixA[1, 0] = 3.0
            matrixA[1, 1] = 4.0
            matrixA[1, 2] = 4.0
            matrixA[2, 0] = 1.0
            matrixA[2, 1] = 1.0
            matrixA[2, 2] = 1.0
            matrixB[0,0] = 5.0
            matrixB[0, 1] = 6.0
            matrixB[0, 2] = 6.0
            matrixB[1, 0] = 7.0
            matrixB[1, 1] = 8.0
            matrixB[1, 2] = 8.0
            matrixB[2, 0] = 1.0
            matrixB[2, 1] = 1.0
            matrixB[2, 2] = 1.0

            var outputMartix = Matrix(rows: 3, columns: 3)
            print(matrixB , matrixA)
            do {
                outputMartix = try! matrixA.sumWith(matrixB: matrixB)
                print(outputMartix)
            }catch RisedError.DimensionNotEquals{
                print("Dimensions are not equal")

            }
        }

    }

    //Matrix Configuration

    struct Matrix {
        let rows: Int, columns: Int
        var grid: [Double]
        init(rows: Int, columns: Int) {
            self.rows = rows
            self.columns = columns
            grid = Array(repeating: 0.0, count: rows * columns)
        }
        func indexIsValidForRow(row: Int, column: Int) -> Bool {
            return row >= 0 && row < rows && column >= 0 && column < columns
        }
        subscript(row: Int, column: Int) -> Double {
            get {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                return grid[(row * columns) + column]
            }
            set {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                grid[(row * columns) + column] = newValue
            }
        }
    }
    extension Matrix: Operation {

        mutating func sumWith(matrixB: Matrix) throws -> Matrix {

            guard self == matrixB else { throw RisedError.DimensionNotEquals }

            for row in 0...self.rows - 1 {
                for column in 0...self.columns - 1 {
                    self[row, column] = matrixB[row, column] + self[row, column]
                }
            }
            return self
        }
    }
枚举RisedError:错误{ 箱子尺寸 大小写明显(字符串) } func==(左:矩阵,右:矩阵)->Bool{ 返回(左行)==(右行)&(左列)==(右列) } 协议操作{ 变异函数sumWith(matrixB:Matrix)抛出->矩阵 } 类ViewController:UIViewController{ //矩阵创建 func matrixCreation(){ 变量矩阵=矩阵(行:3,列:3) var matrixB=矩阵(行:3,列:3) 矩阵[0,0]=1.0 矩阵[0,1]=2.0 矩阵[0,2]=2.0 矩阵[1,0]=3.0 矩阵[1,1]=4.0 矩阵[1,2]=4.0 矩阵[2,0]=1.0 矩阵[2,1]=1.0 矩阵[2,2]=1.0 matrixB[0,0]=5.0 matrixB[0,1]=6.0 matrixB[0,2]=6.0 matrixB[1,0]=7.0 matrixB[1,1]=8.0 matrixB[1,2]=8.0 matrixB[2,0]=1.0 matrixB[2,1]=1.0 matrixB[2,2]=1.0 var outputMartix=矩阵(行:3,列:3) 打印(matrixB、matrixA) 做{ outputMartix=try!matrixA.sumWith(matrixB:matrixB) 打印(outputMartix) }捕集器冒口错误。尺寸不相等{ 打印(“尺寸不相等”) } } } //矩阵配置 结构矩阵{ 让行:Int,列:Int 变量网格:[双精度] init(行:Int,列:Int){ self.rows=行 self.columns=列 网格=数组(重复:0.0,计数:行*列) } func indexIsValidForRow(行:Int,列:Int)->Bool{ 返回行>=0&&row=0&&columnDouble{ 得到{ 断言(indexIsValidForRow(行:行,列:列),“索引超出范围”) 返回网格[(行*列)+列] } 设置{ 断言(indexIsValidForRow(行:行,列:列),“索引超出范围”) 网格[(行*列)+列]=newValue } } } 可拓矩阵:运算{ 变异函数sumWith(matrixB:Matrix)抛出->矩阵{ guard self==matrixB else{throw RisedError.DimensionNotEquals} 对于0中的行…self.rows-1{ 对于0中的列…self.columns-1{ self[row,column]=matrixB[row,column]+self[row,column] } } 回归自我 } }
您能显示错误日志的其余部分吗?如果矩阵维度相同,您是否真的将
A==B
定义为true?如果操场上发生意外情况:1)使用编译过的项目,2)使用调试器单步执行代码。在您使用2x2矩阵的情况下,问题几乎会立即变得明显!
swift 4 - Addition 0f 3 x 3 Matrices

enum RisedError: Error {
        case DimensionNotEquals
        case Obvious(String)
    }
    func ==(lhs: Matrix, rhs: Matrix) -> Bool {
        return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
    }
    protocol Operation {
        mutating func sumWith(matrixB: Matrix) throws -> Matrix

    }
    class ViewController: UIViewController {


    //Matrix creation
        func matrixCreation(){
            var matrixA = Matrix(rows: 3, columns: 3)
            var matrixB = Matrix(rows: 3, columns: 3)
            matrixA[0,0] = 1.0
            matrixA[0, 1] = 2.0
            matrixA[0, 2] = 2.0
            matrixA[1, 0] = 3.0
            matrixA[1, 1] = 4.0
            matrixA[1, 2] = 4.0
            matrixA[2, 0] = 1.0
            matrixA[2, 1] = 1.0
            matrixA[2, 2] = 1.0
            matrixB[0,0] = 5.0
            matrixB[0, 1] = 6.0
            matrixB[0, 2] = 6.0
            matrixB[1, 0] = 7.0
            matrixB[1, 1] = 8.0
            matrixB[1, 2] = 8.0
            matrixB[2, 0] = 1.0
            matrixB[2, 1] = 1.0
            matrixB[2, 2] = 1.0

            var outputMartix = Matrix(rows: 3, columns: 3)
            print(matrixB , matrixA)
            do {
                outputMartix = try! matrixA.sumWith(matrixB: matrixB)
                print(outputMartix)
            }catch RisedError.DimensionNotEquals{
                print("Dimensions are not equal")

            }
        }

    }

    //Matrix Configuration

    struct Matrix {
        let rows: Int, columns: Int
        var grid: [Double]
        init(rows: Int, columns: Int) {
            self.rows = rows
            self.columns = columns
            grid = Array(repeating: 0.0, count: rows * columns)
        }
        func indexIsValidForRow(row: Int, column: Int) -> Bool {
            return row >= 0 && row < rows && column >= 0 && column < columns
        }
        subscript(row: Int, column: Int) -> Double {
            get {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                return grid[(row * columns) + column]
            }
            set {
                assert(indexIsValidForRow(row: row, column: column), "Index out of range")
                grid[(row * columns) + column] = newValue
            }
        }
    }
    extension Matrix: Operation {

        mutating func sumWith(matrixB: Matrix) throws -> Matrix {

            guard self == matrixB else { throw RisedError.DimensionNotEquals }

            for row in 0...self.rows - 1 {
                for column in 0...self.columns - 1 {
                    self[row, column] = matrixB[row, column] + self[row, column]
                }
            }
            return self
        }
    }