2011-01-30 8 views
1

配列の配列(つまり行列)内の行または列の入れ替えが必要です。私はオンラインこのスワップ方法を発見した、と私はboard.matrixは、配列の配列である私のmutate機能、でそれを拡張:Ruby行列の列または行の入れ替え

# 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

次のコードでは、あなたが配列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

問題は、あなただけの新しいOにローカル変数matrixを設定することです作成者:#transpose

次に、明らかにboard.matrixである元のマトリックスオブジェクトを印刷しました。

ローカル変数を使用して行を交換しましたが、その場合はローカルは元のオブジェクトへの参照であったため同じであり、出力ルーチンの観点からは「機能しました」。しかし列では、新しいオブジェクトはtransposeによって返され、boardは更新されませんでした。

関連する問題