2015-11-19 45 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