【问题标题】:Swapping either Columns or Rows in a Ruby Matrix交换 Ruby 矩阵中的列或行
【发布时间】:2011-01-30 20:17:57
【问题描述】:

我想交换数组(即矩阵)中的行或列。我在网上找到了这种交换方法,并用我的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

【问题讨论】:

    标签: ruby arrays matrix multidimensional-array transpose


    【解决方案1】:

    因为在下面的代码中你没有转换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
    

    【讨论】:

      【解决方案2】:

      问题是你只将局部变量matrix设置为#transpose创建的新对象。

      然后你打印了原始矩阵对象,显然是board.matrix

      虽然您还使用了局部变量来交换行,但在这种情况下,局部变量是对原始对象的引用,因此它们是相同的,并且从您的输出例程的角度来看它“有效”。但是对于这些列,transpose 返回了一个新对象,而board 从未更新。

      【讨论】:

        猜你喜欢
        • 2019-07-03
        • 2021-04-29
        • 2019-03-24
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2015-04-20
        相关资源
        最近更新 更多