Added closure-based initializer function for Matrix and corresponding unit test

This commit is contained in:
Vincent Esche 2019-10-02 01:16:45 +02:00
parent 8af8d180db
commit 2d370f39de
2 changed files with 29 additions and 0 deletions

View File

@ -65,6 +65,19 @@ public struct Matrix<Scalar> where Scalar: FloatingPoint, Scalar: ExpressibleByF
self.grid = grid
}
public init(rows: Int, columns: Int, _ closure: (_ row: Int, _ column: Int) throws -> Scalar) rethrows {
var grid: [Scalar] = []
grid.reserveCapacity(rows * columns)
for row in 0..<rows {
for column in 0..<columns {
grid.append(try closure(row, column))
}
}
self.init(rows: rows, columns: columns, grid: grid)
}
public static func identity(size: Int) -> Matrix<Scalar> {
return self.diagonal(rows: size, columns: size, repeatedValue: 1.0)
}

View File

@ -99,6 +99,22 @@ class MatrixTests: XCTestCase {
XCTAssertEqual(actual, expected)
}
func test_init_rows_columns_closure() {
typealias Scalar = Double
let columns = 4
let actual: Matrix<Scalar> = Matrix(rows: 3, columns: columns) { row, column in
Scalar((row * columns) + column)
}
let expected: Matrix<Scalar> = [
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
]
XCTAssertEqual(actual, expected)
}
func test_init_arrayLiteral() {
typealias Scalar = Double