2015-11-19 81 views
1

所以我试图做一个行列式计算器并找到它的算法。为了适应迅速,我不得不改变它一点。斯威夫特的矩阵行列式计算器

我想找到一个矩阵的行列式,它是6x7,但最后一列将不会包含在计算中。 (即计算的6x6矩阵)

即时得到这个错误:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0)

谁能解释这是什么意思?

class ViewController: UIViewController { 

    var values = [Double]() 

    @IBAction func calculate(sender: AnyObject) { 

     for case let textField as UITextField in self.view.subviews { 
      if textField.text == "" { 
       textField.text = "0" 

      } 

      values.append(Double(textField.text!)!) 
     } 

     print(values) 

     // convert to 2d 
     var matrix = [[Double]]() 
     matrix = [[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]] 


     for var i = 0 ; i<6;i++ { 
      for var j = 0 ; j<7 ; j++ { 
       matrix[i][j] = values[i*7 + j] 


      } 
     } 


     print(matrix) 

     var n = 6 

     determ(matrix, n: 6) 
    } 

    func determ (matrix: [[Double]], var n:Int) -> Double { 
     var det:Double = 0 
     var p:Int, i:Int, j:Int,k:Int, h:Int 
     var temp: [[Double]] = [] 
     for p = 0; p < n; p++ { 
      h = 0 
      k = 0 

      for i = 1; i < n ; i++ { 
       for j = 0; j < n; j++ { 
        if (j == p) { 
         continue 
        } 
        temp[h][k] = matrix[i][j] 
        k++ 
        if k == (n-1) { 
         h++ 
         k = 0 
        } 

       } 
      } 
      var power = Double(p) 
      var neg = Double(-1) 
      det = Double(det + matrix[0][p]) * pow(neg, power) * Double(determ(temp, n: n-1)) 

     } 
     return det 
} 
+0

你从哪里得到错误?你的代码究竟有什么问题,请指定行或其他。 – sunshinejr

+0

错误是对于行 temp [h] [k] = matrix [i] [j] 和控制台说“致命错误:数组索引超出范围” – Abrgr

回答

0

在功能func determ(),正是这条线:

var temp: [[Double]] = []

你正在创建一个空数组。然后在循环中,您将索引中的值设置为超出数组索引(实际上,数组没有任何索引)。

temp[h][k] = matrix[i][j]

你需要用0或任何你找到(也许追加)等方式来填补数组,因为你不能设置的值如对于​​,并且为空temp

+0

谢谢!它的工作没有错误。我一直得到行列式= -0,所以我假设算法不正确 – Abrgr

+0

是的,我会一步一步调试会话,看看值不是预期的。此外,如果它有帮助,请将其标记为已接受。您可能也想阅读本文(因为您是新手):http://stackoverflow.com/help/someone-answers – sunshinejr