Swift 快速矩阵和
我正在尝试开发一个func函数,如果两个矩阵等于相同的维数,它允许两个矩阵求和,但是我在尝试中得到一个错误“EXC_BAD_指令” 这是我的游乐场:Swift 快速矩阵和,swift,matrix,sum,Swift,Matrix,Sum,我正在尝试开发一个func函数,如果两个矩阵等于相同的维数,它允许两个矩阵求和,但是我在尝试中得到一个错误“EXC_BAD_指令” 这是我的游乐场: import Foundation enum RisedError: ErrorType { case DimensionNotEquals case Obvious(String) } func ==(lhs: Matrix, rhs: Matrix) -> Bool { return (lhs.rows) ==
import Foundation
enum RisedError: ErrorType {
case DimensionNotEquals
case Obvious(String)
}
func ==(lhs: Matrix, rhs: Matrix) -> Bool {
return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
}
protocol Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix
}
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: 0.0)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
var matrixA = Matrix(rows: 2, columns: 2)
matrixA[0,0] = 1.0
matrixA[0,1] = 2.0
matrixA[1,0] = 3.0
matrixA[1,1] = 4.0
var matrixB = Matrix(rows: 2, columns: 2)
matrixB[0,0] = 5.0
matrixB[0,1] = 6.0
matrixB[1,0] = 7.0
matrixB[1,1] = 8.0
print(matrixA)
print(matrixB)
extension Matrix: Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix {
guard self == matrixB else { throw RisedError.DimensionNotEquals }
for row in 0...self.rows {
for column in 0...self.columns {
self[row, column] = matrixB[row, column] + self[row, column]
}
}
return self
}
}
do {
try matrixA.sumWith(matrixB)
} catch RisedError.DimensionNotEquals {
print("The two matrix's dimensions aren't equals")
} catch {
print("Something very bad happens")
}
<代码>导入基础
枚举RisedError:ErrorType{
箱子尺寸
大小写明显(字符串)
}
func==(左:矩阵,右:矩阵)->Bool{
返回(左行)==(右行)&(左列)==(右列)
}
协议操作{
变异函数sumWith(matrixB:Matrix)抛出->矩阵
}
结构矩阵{
让行:Int,列:Int
变量网格:[双精度]
init(行:Int,列:Int){
self.rows=行
self.columns=列
网格=数组(计数:行*列,重复值:0.0)
}
func indexIsValidForRow(行:Int,列:Int)->Bool{
返回行>=0&&row问题是您正在使用for循环中的
0…self.rows
。这将包括迭代中范围的上限,在您的情况下,它超出了范围,因此将崩溃
您想使用半开范围运算符
。实际上,您的错误是索引超出范围
用此代码替换扩展名
extension Matrix: Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix {
guard self == matrixB else { throw RisedError.DimensionNotEquals }
for row in 0...self.rows - 1 {
for column in 0...self.columns - 1 {
self[row, column] = matrixB[row, column] + self[row, column]
}
}
return self
}
}
希望它能解决您的问题。swift 4-3 x 3矩阵的加法
swift 4 - Addition 0f 3 x 3 Matrices
enum RisedError: Error {
case DimensionNotEquals
case Obvious(String)
}
func ==(lhs: Matrix, rhs: Matrix) -> Bool {
return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
}
protocol Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix
}
class ViewController: UIViewController {
//Matrix creation
func matrixCreation(){
var matrixA = Matrix(rows: 3, columns: 3)
var matrixB = Matrix(rows: 3, columns: 3)
matrixA[0,0] = 1.0
matrixA[0, 1] = 2.0
matrixA[0, 2] = 2.0
matrixA[1, 0] = 3.0
matrixA[1, 1] = 4.0
matrixA[1, 2] = 4.0
matrixA[2, 0] = 1.0
matrixA[2, 1] = 1.0
matrixA[2, 2] = 1.0
matrixB[0,0] = 5.0
matrixB[0, 1] = 6.0
matrixB[0, 2] = 6.0
matrixB[1, 0] = 7.0
matrixB[1, 1] = 8.0
matrixB[1, 2] = 8.0
matrixB[2, 0] = 1.0
matrixB[2, 1] = 1.0
matrixB[2, 2] = 1.0
var outputMartix = Matrix(rows: 3, columns: 3)
print(matrixB , matrixA)
do {
outputMartix = try! matrixA.sumWith(matrixB: matrixB)
print(outputMartix)
}catch RisedError.DimensionNotEquals{
print("Dimensions are not equal")
}
}
}
//Matrix Configuration
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
extension Matrix: Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix {
guard self == matrixB else { throw RisedError.DimensionNotEquals }
for row in 0...self.rows - 1 {
for column in 0...self.columns - 1 {
self[row, column] = matrixB[row, column] + self[row, column]
}
}
return self
}
}
枚举RisedError:错误{
箱子尺寸
大小写明显(字符串)
}
func==(左:矩阵,右:矩阵)->Bool{
返回(左行)==(右行)&(左列)==(右列)
}
协议操作{
变异函数sumWith(matrixB:Matrix)抛出->矩阵
}
类ViewController:UIViewController{
//矩阵创建
func matrixCreation(){
变量矩阵=矩阵(行:3,列:3)
var matrixB=矩阵(行:3,列:3)
矩阵[0,0]=1.0
矩阵[0,1]=2.0
矩阵[0,2]=2.0
矩阵[1,0]=3.0
矩阵[1,1]=4.0
矩阵[1,2]=4.0
矩阵[2,0]=1.0
矩阵[2,1]=1.0
矩阵[2,2]=1.0
matrixB[0,0]=5.0
matrixB[0,1]=6.0
matrixB[0,2]=6.0
matrixB[1,0]=7.0
matrixB[1,1]=8.0
matrixB[1,2]=8.0
matrixB[2,0]=1.0
matrixB[2,1]=1.0
matrixB[2,2]=1.0
var outputMartix=矩阵(行:3,列:3)
打印(matrixB、matrixA)
做{
outputMartix=try!matrixA.sumWith(matrixB:matrixB)
打印(outputMartix)
}捕集器冒口错误。尺寸不相等{
打印(“尺寸不相等”)
}
}
}
//矩阵配置
结构矩阵{
让行:Int,列:Int
变量网格:[双精度]
init(行:Int,列:Int){
self.rows=行
self.columns=列
网格=数组(重复:0.0,计数:行*列)
}
func indexIsValidForRow(行:Int,列:Int)->Bool{
返回行>=0&&row=0&&columnDouble{
得到{
断言(indexIsValidForRow(行:行,列:列),“索引超出范围”)
返回网格[(行*列)+列]
}
设置{
断言(indexIsValidForRow(行:行,列:列),“索引超出范围”)
网格[(行*列)+列]=newValue
}
}
}
可拓矩阵:运算{
变异函数sumWith(matrixB:Matrix)抛出->矩阵{
guard self==matrixB else{throw RisedError.DimensionNotEquals}
对于0中的行…self.rows-1{
对于0中的列…self.columns-1{
self[row,column]=matrixB[row,column]+self[row,column]
}
}
回归自我
}
}
您能显示错误日志的其余部分吗?如果矩阵维度相同,您是否真的将A==B
定义为true?如果操场上发生意外情况:1)使用编译过的项目,2)使用调试器单步执行代码。在您使用2x2矩阵的情况下,问题几乎会立即变得明显!
swift 4 - Addition 0f 3 x 3 Matrices
enum RisedError: Error {
case DimensionNotEquals
case Obvious(String)
}
func ==(lhs: Matrix, rhs: Matrix) -> Bool {
return (lhs.rows) == (rhs.rows) && (lhs.columns) == (rhs.columns)
}
protocol Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix
}
class ViewController: UIViewController {
//Matrix creation
func matrixCreation(){
var matrixA = Matrix(rows: 3, columns: 3)
var matrixB = Matrix(rows: 3, columns: 3)
matrixA[0,0] = 1.0
matrixA[0, 1] = 2.0
matrixA[0, 2] = 2.0
matrixA[1, 0] = 3.0
matrixA[1, 1] = 4.0
matrixA[1, 2] = 4.0
matrixA[2, 0] = 1.0
matrixA[2, 1] = 1.0
matrixA[2, 2] = 1.0
matrixB[0,0] = 5.0
matrixB[0, 1] = 6.0
matrixB[0, 2] = 6.0
matrixB[1, 0] = 7.0
matrixB[1, 1] = 8.0
matrixB[1, 2] = 8.0
matrixB[2, 0] = 1.0
matrixB[2, 1] = 1.0
matrixB[2, 2] = 1.0
var outputMartix = Matrix(rows: 3, columns: 3)
print(matrixB , matrixA)
do {
outputMartix = try! matrixA.sumWith(matrixB: matrixB)
print(outputMartix)
}catch RisedError.DimensionNotEquals{
print("Dimensions are not equal")
}
}
}
//Matrix Configuration
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValidForRow(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValidForRow(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValidForRow(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
extension Matrix: Operation {
mutating func sumWith(matrixB: Matrix) throws -> Matrix {
guard self == matrixB else { throw RisedError.DimensionNotEquals }
for row in 0...self.rows - 1 {
for column in 0...self.columns - 1 {
self[row, column] = matrixB[row, column] + self[row, column]
}
}
return self
}
}