Обмен столбцов или строк в матрице Ruby - PullRequest
1 голос
/ 30 января 2011

Я хочу поменять строки или столбцы в массиве массивов (то есть в матрице).Я нашел этот метод подкачки в сети и расширил его с помощью моей mutate функции, где board.matrix - массив массивов:

# Swap to elements of an Array
def swap!(a,b)
  self[a], self[b] = self[b], self[a]
  self
end

def mutate(board)
  matrix = board.matrix
  random = rand
  rand_a = rand(matrix.length-1)
  rand_b = rand(matrix.length-1)

  puts "Old one:"
  board.print_matrix
  # We have a 50:50 chance of swapping either columns or rows
  if random <= 0.5
    # Swap columns: Transpose first
    puts "Swapping columns #{rand_a} and #{rand_b}..."
    temp = matrix.transpose
    temp.swap!(rand_a, rand_b)
    matrix = temp.transpose
  else
    # Just swap rows
    puts "Swapping rows #{rand_a} and #{rand_b}..."
    matrix.swap!(rand_a, rand_b)
  end
  puts "New one:"
  board.print_matrix
end

Теперь он делает то, что должен для строк:

Old one:
X  X  0  0  
0  0  0  0  
X  X  0  0  
0  0  0  0  

Swapping rows 1 and 0...
New one:
0  0  0  0  
X  X  0  0  
X  X  0  0  
0  0  0  0

Но это не для столбцов.Почему это так?

Old one:
0  X  X  0  
0  0  X  0  
X  0  0  0  
0  0  0  0  

Swapping columns 1 and 0...
New one:
0  X  X  0  
0  0  X  0  
X  0  0  0  
0  0  0  0

Ответы [ 2 ]

2 голосов
/ 30 января 2011

Проблема в том, что вы устанавливаете только локальную переменную matrix для нового объекта, созданного #transpose.

Затем вы печатаете оригинальный матричный объект, который, по-видимому, board.matrix.

Хотя вы также использовали локальную переменную для перестановки строк, в этом случае локальная была ссылкой на исходный объект, поэтому они были одинаковыми, и она «работала» с точки зрения вашей выходной подпрограммы.Но со столбцами новый объект был возвращен transpose, а board никогда не обновлялся.

2 голосов
/ 30 января 2011

Поскольку в следующем коде вы не преобразовали массив, на который указывает matrix, вы просто присвоили новый массив для matrix, который является локальной переменной:

temp = matrix.transpose
temp.swap!(rand_a, rand_b)
matrix = temp.transpose

Вы можете заменить этот код следующим:

matrix.each do |row|
    row[rand_a], row[rand_b] = row[rand_b], row[rand_a]
end
...