首页 > 解决方案 > 我总是在 mat[i][j] = matrix[i+1][j+1] 处遇到异常 INDEX OUT OF RANGE

问题描述

为什么我的索引超出范围mat[i][j] = matrix[i+1][j+1]

在下面的函数中,我试图计算矩阵的确定器。

功能eraze是擦除一行和一列,因此当我填充新矩阵(数组)时。异常显示“索引超出范围”。

func det2(matrix :[[Int]] ) -> Int {
    var p : Int

    p = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]

    return p
}

func det(matrix :[[Int]] , fo : Int ) -> Int {
    var p2 : Int = 0
    if (fo == 2) {
        p2 = det2(matrix: matrix)

    } else {
        for j in 0..<fo {
            p2 = matrix[j][0] * det(matrix: eraze(matrix: matrix, nb: j, dim: fo), fo: fo-1)            
        }
    }  

    return p2
}

func eraze(matrix : [[Int]] , nb: Int , dim : Int) -> [[Int]] {
    var mat = [[Int]]()

    for i in 0..<dim-1 {
        for j in 0..<dim-1 {
            if (i == nb )  || (i>nb) {
                mat[i][j] = matrix[i+1][j+1]
            } else if (i<nb) {
                mat[i][j] = matrix[i][j+1]
            }
        }                                               
    }

    return mat
}

标签: arraysswift

解决方案


您的第一个问题是eraze(),您没有初始化mat. 在 Swift 中,你不能索引一个空数组。

代替:

var mat = [[Int]]()

和:

var mat = [[Int]](repeating: Array(repeating: 0, count: dim - 1), count: dim - 1)

通过该更改,您的代码不再崩溃,但会产生不正确的结果。

您忘记总结扩展的值,当您这样做时,您需要交替sign的值:

func det(matrix :[[Int]] , fo : Int ) -> Int {
    func sign(_ n: Int) -> Int {
        return n % 2 == 0 ? 1 : -1
    }

    var p2 : Int = 0
    if (fo == 2) {
        p2 = det2(matrix: matrix)

    } else {
        for j in 0..<fo {
            p2 += (sign(j) * matrix[j][0] * det(matrix: eraze(matrix: matrix, nb: j, dim: fo), fo: fo-1))
        }
    }

    return p2
}

测试

det(matrix: [[1, 4, 7, 3, -6], [2, 5, 8, 4, -3], [3, 6, 10, -5, 14], [1, -2, 3, 4, 5], [6, -5, 4, -3, 2]], fo: 5)
13090

这与Wolfram Alpha一致


推荐阅读