0001 // Hyperbolic.swift 0002 // 0003 // Copyright (c) 2014–2015 Mattt Thompson (http://mattt.me) 0004 // 0005 // Permission is hereby granted, free of charge, to any person obtaining a copy 0006 // of this software and associated documentation files (the "Software"), to deal 0007 // in the Software without restriction, including without limitation the rights 0008 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0009 // copies of the Software, and to permit persons to whom the Software is 0010 // furnished to do so, subject to the following conditions: 0011 // 0012 // The above copyright notice and this permission notice shall be included in 0013 // all copies or substantial portions of the Software. 0014 // 0015 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0016 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0017 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0018 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0019 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0020 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 0021 // THE SOFTWARE. 0022 0023 import Accelerate 0024 0025 public struct Matrix<T
Matrix.swift:70 extension Matrix: CustomStringConvertible {Matrix.swift:97 extension Matrix: SequenceType {Matrix.swift:117 public func add(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:117 public func add(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:117 public func add(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:126 public func add(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:126 public func add(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:126 public func add(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:135 public func mul(alpha: Float, x: Matrix<Float>) -> Matrix<Float> {Matrix.swift:135 public func mul(alpha: Float, x: Matrix<Float>) -> Matrix<Float> {Matrix.swift:142 public func mul(alpha: Double, x: Matrix<Double>) -> Matrix<Double> {Matrix.swift:142 public func mul(alpha: Double, x: Matrix<Double>) -> Matrix<Double> {Matrix.swift:149 public func mul(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:149 public func mul(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:149 public func mul(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:152 var results = Matrix<Float>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:158 public func mul(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:158 public func mul(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:158 public func mul(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:161 var results = Matrix<Double>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:167 public func div(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:167 public func div(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:167 public func div(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> {Matrix.swift:173 public func div(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:173 public func div(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:173 public func div(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> {Matrix.swift:179 public func inv(x : Matrix<Float>) -> Matrix<Float> {Matrix.swift:179 public func inv(x : Matrix<Float>) -> Matrix<Float> {Matrix.swift:198 public func inv(x : Matrix<Double>) -> Matrix<Double> {Matrix.swift:198 public func inv(x : Matrix<Double>) -> Matrix<Double> {Matrix.swift:217 public func transpose(x: Matrix<Float>) -> Matrix<Float> {Matrix.swift:217 public func transpose(x: Matrix<Float>) -> Matrix<Float> {Matrix.swift:218 var results = Matrix<Float>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:224 public func transpose(x: Matrix<Double>) -> Matrix<Double> {Matrix.swift:224 public func transpose(x: Matrix<Double>) -> Matrix<Double> {Matrix.swift:225 var results = Matrix<Double>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:233 public func + (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:233 public func + (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:233 public func + (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:237 public func + (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:237 public func + (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:237 public func + (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:241 public func * (lhs: Float, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:241 public func * (lhs: Float, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:245 public func * (lhs: Double, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:245 public func * (lhs: Double, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:249 public func * (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:249 public func * (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:249 public func * (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:253 public func * (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:253 public func * (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:253 public func * (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:257 public func / (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:257 public func / (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:257 public func / (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> {Matrix.swift:261 public func / (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:261 public func / (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:261 public func / (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {Matrix.swift:266 public postfix func ′ (value: Matrix<Float>) -> Matrix<Float> {Matrix.swift:266 public postfix func ′ (value: Matrix<Float>) -> Matrix<Float> {Matrix.swift:270 public postfix func ′ (value: Matrix<Double>) -> Matrix<Double> {Matrix.swift:270 public postfix func ′ (value: Matrix<Double>) -> Matrix<Double> {where T: FloatingPointType, T: FloatLiteralConvertible> { 0026 public typealias Element
Matrix.swift:26 public typealias Element = T= T 0027 0028 let rows
Matrix.swift:30 var grid: [Element]Matrix.swift:32 public init(rows: Int, columns: Int, repeatedValue: Element) {Matrix.swift:36 self.grid = [Element](count: rows * columns, repeatedValue: repeatedValue)Matrix.swift:39 public init(_ contents: [[Element]]) {Matrix.swift:42 let repeatedValue: Element = 0.0Matrix.swift:98 public func generate() -> AnyGenerator<ArraySlice<Element>> {: Int 0029 let columns
Matrix.swift:33 self.rows = rowsMatrix.swift:64 return row >= 0 && row < rows && column >= 0 && column < columnsMatrix.swift:74 for i in 0..<rows {Matrix.swift:77 switch (i, rows) {Matrix.swift:82 case (rows - 1, _):Matrix.swift:99 let endIndex = rows * columnsMatrix.swift:118 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:118 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:127 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:127 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:150 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication")Matrix.swift:152 var results = Matrix<Float>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:159 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication")Matrix.swift:161 var results = Matrix<Double>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:169 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible")Matrix.swift:175 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible")Matrix.swift:180 precondition(x.rows == x.columns, "Matrix must be square")Matrix.swift:184 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0)Matrix.swift:184 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0)Matrix.swift:199 precondition(x.rows == x.columns, "Matrix must be square")Matrix.swift:203 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0)Matrix.swift:203 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0)Matrix.swift:218 var results = Matrix<Float>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:219 vDSP_mtrans(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))Matrix.swift:225 var results = Matrix<Double>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:226 vDSP_mtransD(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns)): Int 0030 var grid
Matrix.swift:34 self.columns = columnsMatrix.swift:54 return grid[(row * columns) + column]Matrix.swift:59 grid[(row * columns) + column] = newValueMatrix.swift:64 return row >= 0 && row < rows && column >= 0 && column < columnsMatrix.swift:75 let contents = (0..<columns).map{"\(self[i, $0])"}.joinWithSeparator("\t")Matrix.swift:99 let endIndex = rows * columnsMatrix.swift:108 nextRowStartIndex += self.columnsMatrix.swift:118 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:118 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:127 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:127 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition")Matrix.swift:150 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication")Matrix.swift:152 var results = Matrix<Float>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:159 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication")Matrix.swift:161 var results = Matrix<Double>(rows: x.rows, columns: y.columns, repeatedValue: 0.0)Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:169 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible")Matrix.swift:175 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible")Matrix.swift:180 precondition(x.rows == x.columns, "Matrix must be square")Matrix.swift:185 var lwork = __CLPK_integer(x.columns * x.columns)Matrix.swift:185 var lwork = __CLPK_integer(x.columns * x.columns)Matrix.swift:188 var nc = __CLPK_integer(x.columns)Matrix.swift:199 precondition(x.rows == x.columns, "Matrix must be square")Matrix.swift:204 var lwork = __CLPK_integer(x.columns * x.columns)Matrix.swift:204 var lwork = __CLPK_integer(x.columns * x.columns)Matrix.swift:207 var nc = __CLPK_integer(x.columns)Matrix.swift:218 var results = Matrix<Float>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:219 vDSP_mtrans(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))Matrix.swift:225 var results = Matrix<Double>(rows: x.columns, columns: x.rows, repeatedValue: 0.0)Matrix.swift:226 vDSP_mtransD(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns)): [Element] 0031 0032 public init
Matrix.swift:36 self.grid = [Element](count: rows * columns, repeatedValue: repeatedValue)Matrix.swift:47 grid.replaceRange(i*n..<i*n+min(m, row.count), with: row)Matrix.swift:54 return grid[(row * columns) + column]Matrix.swift:59 grid[(row * columns) + column] = newValueMatrix.swift:110 return self.grid[currentRowStartIndex..<nextRowStartIndex]Matrix.swift:121 cblas_saxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:121 cblas_saxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:121 cblas_saxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:130 cblas_daxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:130 cblas_daxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:130 cblas_daxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1)Matrix.swift:137 cblas_sscal(Int32(x.grid.count), alpha, &(results.grid), 1)Matrix.swift:137 cblas_sscal(Int32(x.grid.count), alpha, &(results.grid), 1)Matrix.swift:144 cblas_dscal(Int32(x.grid.count), alpha, &(results.grid), 1)Matrix.swift:144 cblas_dscal(Int32(x.grid.count), alpha, &(results.grid), 1)Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns))Matrix.swift:190 sgetrf_(&nc, &nc, &(results.grid), &nc, &ipiv, &error)Matrix.swift:191 sgetri_(&nc, &(results.grid), &nc, &ipiv, &work, &lwork, &error)Matrix.swift:209 dgetrf_(&nc, &nc, &(results.grid), &nc, &ipiv, &error)Matrix.swift:210 dgetri_(&nc, &(results.grid), &nc, &ipiv, &work, &lwork, &error)Matrix.swift:219 vDSP_mtrans(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))Matrix.swift:219 vDSP_mtrans(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))Matrix.swift:226 vDSP_mtransD(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))Matrix.swift:226 vDSP_mtransD(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns))(rows: Int, columns: Int, repeatedValue: Element) { 0033 self.rows = rows 0034 self.columns = columns 0035 0036 self.grid = [Element](count: rows * columns, repeatedValue: repeatedValue) 0037 } 0038 0039 public init(_ contents: [[Element]]) { 0040 let m: Int = contents.count 0041 let n: Int = contents[0].count 0042 let repeatedValue: Element = 0.0 0043 0044 self.init(rows: m, columns: n, repeatedValue: repeatedValue) 0045 0046 for (i, row) in contents.enumerate() { 0047 grid.replaceRange(i*n..<i*n+min(m, row.count), with: row) 0048 } 0049 } 0050 0051 public subscript
Matrix.swift:44 self.init(rows: m, columns: n, repeatedValue: repeatedValue)(row: Int, column: Int) -> Element { 0052 get { 0053 assert(indexIsValidForRow(row, column: column)) 0054 return grid[(row * columns) + column] 0055 } 0056 0057 set { 0058 assert(indexIsValidForRow(row, column: column)) 0059 grid[(row * columns) + column] = newValue 0060 } 0061 } 0062 0063 private func indexIsValidForRow
Matrix.swift:75 let contents = (0..<columns).map{"\(self[i, $0])"}.joinWithSeparator("\t")(row: Int, column: Int) -> Bool { 0064 return row >= 0 && row < rows && column >= 0 && column < columns 0065 } 0066 } 0067 0068 // MARK: - Printable 0069 0070 extension Matrix: CustomStringConvertible { 0071 public var description: String { 0072 var description = "" 0073 0074 for i in 0..<rows { 0075 let contents = (0..<columns).map{"\(self[i, $0])"}.joinWithSeparator("\t") 0076 0077 switch (i, rows) { 0078 case (0, 1): 0079 description += "(\t\(contents)\t)" 0080 case (0, _): 0081 description += "⎛\t\(contents)\t⎞" 0082 case (rows - 1, _): 0083 description += "⎝\t\(contents)\t⎠" 0084 default: 0085 description += "⎜\t\(contents)\t⎥" 0086 } 0087 0088 description += "\n" 0089 } 0090 0091 return description 0092 } 0093 } 0094 0095 // MARK: - SequenceType 0096 0097 extension Matrix: SequenceType { 0098 public func generate() -> AnyGenerator<ArraySlice<Element>> { 0099 let endIndex = rows * columns 0100 var nextRowStartIndex = 0 0101 0102 return anyGenerator { 0103 if nextRowStartIndex == endIndex { 0104 return nil 0105 } 0106 0107 let currentRowStartIndex = nextRowStartIndex 0108 nextRowStartIndex += self.columns 0109 0110 return self.grid[currentRowStartIndex..<nextRowStartIndex] 0111 } 0112 } 0113 } 0114 0115 // MARK: - 0116 0117 public func add
Matrix.swift:53 assert(indexIsValidForRow(row, column: column))Matrix.swift:58 assert(indexIsValidForRow(row, column: column))(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> { 0118 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition") 0119 0120 var results = y 0121 cblas_saxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1) 0122 0123 return results 0124 } 0125 0126 public func add
Matrix.swift:234 return add(lhs, y: rhs)(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> { 0127 precondition(x.rows == y.rows && x.columns == y.columns, "Matrix dimensions not compatible with addition") 0128 0129 var results = y 0130 cblas_daxpy(Int32(x.grid.count), 1.0, x.grid, 1, &(results.grid), 1) 0131 0132 return results 0133 } 0134 0135 public func mul
Matrix.swift:238 return add(lhs, y: rhs)(alpha: Float, x: Matrix<Float>) -> Matrix<Float> { 0136 var results = x 0137 cblas_sscal(Int32(x.grid.count), alpha, &(results.grid), 1) 0138 0139 return results 0140 } 0141 0142 public func mul
Matrix.swift:242 return mul(lhs, x: rhs)(alpha: Double, x: Matrix<Double>) -> Matrix<Double> { 0143 var results = x 0144 cblas_dscal(Int32(x.grid.count), alpha, &(results.grid), 1) 0145 0146 return results 0147 } 0148 0149 public func mul
Matrix.swift:246 return mul(lhs, x: rhs)(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> { 0150 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication") 0151 0152 var results = Matrix<Float>(rows: x.rows, columns: y.columns, repeatedValue: 0.0) 0153 cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns)) 0154 0155 return results 0156 } 0157 0158 public func mul
Matrix.swift:176 return mul(x, y: yInv)Matrix.swift:250 return mul(lhs, y: rhs)(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> { 0159 precondition(x.columns == y.rows, "Matrix dimensions not compatible with multiplication") 0160 0161 var results = Matrix<Double>(rows: x.rows, columns: y.columns, repeatedValue: 0.0) 0162 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, Int32(x.rows), Int32(y.columns), Int32(x.columns), 1.0, x.grid, Int32(x.columns), y.grid, Int32(y.columns), 0.0, &(results.grid), Int32(results.columns)) 0163 0164 return results 0165 } 0166 0167 public func div
Matrix.swift:170 return mul(x, y: yInv)Matrix.swift:254 return mul(lhs, y: rhs)(x: Matrix<Double>, y: Matrix<Double>) -> Matrix<Double> { 0168 let yInv = inv(y) 0169 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible") 0170 return mul(x, y: yInv) 0171 } 0172 0173 public func div
Matrix.swift:258 return div(lhs, y: rhs)(x: Matrix<Float>, y: Matrix<Float>) -> Matrix<Float> { 0174 let yInv = inv(y) 0175 precondition(x.columns == yInv.rows, "Matrix dimensions not compatible") 0176 return mul(x, y: yInv) 0177 } 0178 0179 public func inv
Matrix.swift:262 return div(lhs, y: rhs)(x : Matrix<Float>) -> Matrix<Float> { 0180 precondition(x.rows == x.columns, "Matrix must be square") 0181 0182 var results = x 0183 0184 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0) 0185 var lwork = __CLPK_integer(x.columns * x.columns) 0186 var work = [CFloat](count: Int(lwork), repeatedValue: 0.0) 0187 var error: __CLPK_integer = 0 0188 var nc = __CLPK_integer(x.columns) 0189 0190 sgetrf_(&nc, &nc, &(results.grid), &nc, &ipiv, &error) 0191 sgetri_(&nc, &(results.grid), &nc, &ipiv, &work, &lwork, &error) 0192 0193 assert(error == 0, "Matrix not invertible") 0194 0195 return results 0196 } 0197 0198 public func inv
Matrix.swift:174 let yInv = inv(y)(x : Matrix<Double>) -> Matrix<Double> { 0199 precondition(x.rows == x.columns, "Matrix must be square") 0200 0201 var results = x 0202 0203 var ipiv = [__CLPK_integer](count: x.rows * x.rows, repeatedValue: 0) 0204 var lwork = __CLPK_integer(x.columns * x.columns) 0205 var work = [CDouble](count: Int(lwork), repeatedValue: 0.0) 0206 var error: __CLPK_integer = 0 0207 var nc = __CLPK_integer(x.columns) 0208 0209 dgetrf_(&nc, &nc, &(results.grid), &nc, &ipiv, &error) 0210 dgetri_(&nc, &(results.grid), &nc, &ipiv, &work, &lwork, &error) 0211 0212 assert(error == 0, "Matrix not invertible") 0213 0214 return results 0215 } 0216 0217 public func transpose
Matrix.swift:168 let yInv = inv(y)(x: Matrix<Float>) -> Matrix<Float> { 0218 var results = Matrix<Float>(rows: x.columns, columns: x.rows, repeatedValue: 0.0) 0219 vDSP_mtrans(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns)) 0220 0221 return results 0222 } 0223 0224 public func transpose
Matrix.swift:267 return transpose(value)(x: Matrix<Double>) -> Matrix<Double> { 0225 var results = Matrix<Double>(rows: x.columns, columns: x.rows, repeatedValue: 0.0) 0226 vDSP_mtransD(x.grid, 1, &(results.grid), 1, vDSP_Length(results.rows), vDSP_Length(results.columns)) 0227 0228 return results 0229 } 0230 0231 // MARK: - Operators 0232 0233 public func + (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> { 0234 return add(lhs, y: rhs) 0235 } 0236 0237 public func + (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> { 0238 return add(lhs, y: rhs) 0239 } 0240 0241 public func * (lhs: Float, rhs: Matrix<Float>) -> Matrix<Float> { 0242 return mul(lhs, x: rhs) 0243 } 0244 0245 public func * (lhs: Double, rhs: Matrix<Double>) -> Matrix<Double> { 0246 return mul(lhs, x: rhs) 0247 } 0248 0249 public func * (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> { 0250 return mul(lhs, y: rhs) 0251 } 0252 0253 public func * (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> { 0254 return mul(lhs, y: rhs) 0255 } 0256 0257 public func / (lhs: Matrix<Double>, rhs: Matrix<Double>) -> Matrix<Double> { 0258 return div(lhs, y: rhs) 0259 } 0260 0261 public func / (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> { 0262 return div(lhs, y: rhs) 0263 } 0264 0265 postfix operator ′ {} 0266 public postfix func ′ (value: Matrix<Float>) -> Matrix<Float> { 0267 return transpose(value) 0268 } 0269 0270 public postfix func ′ (value: Matrix<Double>) -> Matrix<Double> { 0271 return transpose(value) 0272 } 0273
Matrix.swift:271 return transpose(value)