быстрое изменение значения в другом столбце в матрице меняет другой - PullRequest
0 голосов
/ 29 мая 2018

Это модификация примера параметров нижнего индекса, представленного в официальном документе 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, хотя я не изменил его.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы забыли добавить значение column при индексации массива print:

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") }
    
0 голосов
/ 29 мая 2018

То, что вы создали, не является матрицей, это просто Array.Когда вы пытаетесь присвоить вашей переменной mat значение, вы не устанавливаете ее для остроконечной позиции в матрице, но вы устанавливаете значение для позиции 0 и еще раз на 0 в mat.Результат: mat = [1.0].Далее вы установите mat[0,1] = 2.0.Результат: mat = [2.0, 2.0].Например, для создания двумерной матрицы:var matrix = [[Int]]()Теперь, чтобы назначить значение для этой матрицы, используйте:matrix[0][0] = 1.0matrix[0][1] = 2.0

...