【问题标题】:i get alway an exception INDEX OUT OF RANGE at mat[i][j] = matrix[i+1][j+1]我总是在 mat[i][j] = matrix[i+1][j+1] 处遇到异常 INDEX OUT OF RANGE
【发布时间】:2019-08-03 01:44:09
【问题描述】:

为什么我的索引超出了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
}

【问题讨论】:

  • index out of range 错误只有一个原因,那就是你跑到了数组/集合/列表的末尾或其他什么地方。使用调试器逐步检查您的代码以找到导致问题的确切行,然后您可以检查索引的值以找出您在逻辑中犯错的地方。我们无法为您做到这一点。
  • 感谢当我使用该函数时,它会将我的函数体返回到我不使用数组的任何维度的行,这就是我感到困惑的原因
  • 如果您单步执行代码,调试器应该会准确地告诉您问题发生在哪里。我们没有您的数据,没有您的其余代码,也无法为您调试代码。

标签: arrays swift


【解决方案1】:

您的第一个问题是在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

【讨论】:

  • 谢谢你!解决它..是的,我确实使用电源签名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2019-04-19
  • 2016-03-18
  • 2012-10-20
  • 2023-04-05
相关资源
最近更新 更多