swift 改变矩阵中不同列的值会改变一个不同的值
swift changing value in a different column in a matrix changes a different one
这是对Apple // 官方文档中提供的下标选项示例的修改。
所以,我创建了一个结构 -
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating:0.0, count:rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) ]
}
set {
print[(row * columns) ] = newValue
}
}
}
我创建了实例 -
var mat = Matrix(rows: 3, columns: 3)
现在如果我只设置值 -
mat[0,0] = 1.0
并打印 -
print("\(mat[0,0])") //1.0
它打印 1.0,这是应该的
但是当我在上面进行更改并按如下方式设置和打印值时 -
mat[0,0] = 1.0
mat[0,1] = 2.0
现在如果我打印
print("\(mat[0,0])") // 2.0
现在,我的问题是,为什么它 [0,0] 变成了 2.0,虽然我没有改变它。
您创建的不是矩阵,它只是一个Array
。当你试图给你的变量 mat
一个值时,你不会将它设置为矩阵中的一个指定位置,而是将值设置为位置 0 并再次设置为 mat
中的 0。结果:mat = [1.0]
。接下来设置 mat[0,1] = 2.0
。结果:mat = [2.0, 2.0].
例如,要创建一个二维矩阵,请使用:
var matrix = [[Int]]()
现在为此矩阵分配一个值使用:
matrix[0][0] = 1.0
matrix[0][1] = 2.0
您在索引 print
数组时忘记添加 column
值:
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating:0.0, count:rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) + column]
}
set {
print[(row * columns) + column] = newValue
}
}
}
修复之前,所有案例 mat[0,0]
、mat[0,1]
和 mat[0,2]
都访问相同的值:print[0]
.
示例:
var mat = Matrix(rows: 2, columns: 3)
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,2] = 4.0
print(mat[0,0])
print(mat[0,1])
print(mat[1,0])
print(mat[1,2])
print(mat)
输出:
1.0
2.0
3.0
4.0
Matrix(rows: 2, columns: 3, print: [1.0, 2.0, 0.0, 3.0, 0.0, 4.0])
备注:
print
是一个糟糕的数组名称,因为它也是顶级 Swift 函数。我建议使用其他名称,例如 values
.
您应该验证索引并创建一个 fatalError
如果它们超出范围。如果不这样做,那么上例中的 print(mat[0,5])
将打印 4.0
,即使 columns
值超出范围。
将此检查添加到您的 get
和 set
:
guard (0..<rows).contains(row) else { fatalError("row index out of range") }
guard (0..<columns).contains(column) else { fatalError("column index out of range") }
这是对Apple // 官方文档中提供的下标选项示例的修改。
所以,我创建了一个结构 -
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating:0.0, count:rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) ]
}
set {
print[(row * columns) ] = newValue
}
}
}
我创建了实例 -
var mat = Matrix(rows: 3, columns: 3)
现在如果我只设置值 -
mat[0,0] = 1.0
并打印 -
print("\(mat[0,0])") //1.0
它打印 1.0,这是应该的
但是当我在上面进行更改并按如下方式设置和打印值时 -
mat[0,0] = 1.0
mat[0,1] = 2.0
现在如果我打印
print("\(mat[0,0])") // 2.0
现在,我的问题是,为什么它 [0,0] 变成了 2.0,虽然我没有改变它。
您创建的不是矩阵,它只是一个Array
。当你试图给你的变量 mat
一个值时,你不会将它设置为矩阵中的一个指定位置,而是将值设置为位置 0 并再次设置为 mat
中的 0。结果:mat = [1.0]
。接下来设置 mat[0,1] = 2.0
。结果:mat = [2.0, 2.0].
例如,要创建一个二维矩阵,请使用:
var matrix = [[Int]]()
现在为此矩阵分配一个值使用:
matrix[0][0] = 1.0
matrix[0][1] = 2.0
您在索引 print
数组时忘记添加 column
值:
struct Matrix {
let rows: Int, columns: Int
var print: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
print = Array(repeating:0.0, count:rows * columns)
}
subscript(row: Int, column: Int) -> Double {
get {
return print[(row * columns) + column]
}
set {
print[(row * columns) + column] = newValue
}
}
}
修复之前,所有案例 mat[0,0]
、mat[0,1]
和 mat[0,2]
都访问相同的值:print[0]
.
示例:
var mat = Matrix(rows: 2, columns: 3)
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,2] = 4.0
print(mat[0,0])
print(mat[0,1])
print(mat[1,0])
print(mat[1,2])
print(mat)
输出:
1.0 2.0 3.0 4.0 Matrix(rows: 2, columns: 3, print: [1.0, 2.0, 0.0, 3.0, 0.0, 4.0])
备注:
print
是一个糟糕的数组名称,因为它也是顶级 Swift 函数。我建议使用其他名称,例如values
.您应该验证索引并创建一个
fatalError
如果它们超出范围。如果不这样做,那么上例中的print(mat[0,5])
将打印4.0
,即使columns
值超出范围。将此检查添加到您的
get
和set
:guard (0..<rows).contains(row) else { fatalError("row index out of range") } guard (0..<columns).contains(column) else { fatalError("column index out of range") }