arrays - 我总是在 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
}
解决方案
您的第一个问题是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
推荐阅读
- sql - 可以在 join on 子句中使用 Select 语句吗?
- javascript - 打开 devtools 时 jQuery AJAX 调用失败
- spring-boot - 用于不同记录的Spring数据jpa方法
- excel - VBA listobject 不会添加行
- c - (更新)如何从 C 中执行 PowerShell 中的几行代码?
- powershell - 带有 -Include 参数的 Move-Item 引发“项目不存在”错误
- android - 防止从第一个编辑文本打开的软输入在第二个编辑文本中打开
- hyperledger-fabric - 如何确保一个链码被另一个链码调用
- spring - 当 Spring 上下文初始化失败时如何中断集成测试?
- react-native - 如何延迟 Redux Persist Gate 的 SplashScreen?