2

我有两个数组:

@a = [ 
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
@b = [a, b, c]

我需要将第 n 列替换ab

swap_column(0)
#=> [a, 2, 3]
    [b, 5, 6]
    [c, 8, 9]

(如果有人想知道,这是为了使用克莱默规则求解方程组。)

我想出的代码:

  def swap_column(n)
    @a.map.with_index { |row, j| row[n] = @b[j] }
  end

如何在这里摆脱分配,以便map在保持@a 完整的同时返回修改后的矩阵?

4

3 回答 3

2

你想要的是dup. 此外,您的块的返回值map.with_index错误。

def swap_column(i)
  @a.map.with_index{|row, j| row = row.dup; row[i] = @b[j]; row}
end

或者

def swap_column(i)
  @a.map.with_index{|row, j| row.dup.tap{|row| row[i] = @b[j]}}
end
于 2013-10-03T21:18:29.817 回答
1

sawa 的回答很好,重点是你需要dup你的内部数组才能正常工作。这篇附加帖子的唯一原因是要指出,通常当您使用 with_index 时,您可以直接 1:1 索引另一个数组,您可以使用zip.

def swap_column(n)
  @a.zip(@b).map {|r,e| r.dup.tap{|r| r[n] = e}}
end

什么zip是将您的两个数组组合成一个新数组,其中每个元素都是由初始数组的两个对应元素组成的数组。在这种情况下,它将是一个数组和一个您想要稍后用于替换的元素的数组。然后我们映射这些结果并自动将每个元素解构为两部分。然后我们dup将数组片和tap它替换为第 n 个元素。

于 2013-10-03T21:57:19.367 回答
0

您可以使用transpose执行以下操作:

class M
  attr :a, :b

  def initialize
    @a = [[1,2,3],
          [4,5,6],
          [7,8,9]
        ]
    @b = [:a, :b, :c]
  end

  def swap_column(n)
    t = @a.transpose
    t[0] = @b
    t.transpose
  end

end

m = M.new
=> #<M:0x007ffdc2952e38 @a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]], @b=[:a, :b, :c]>
m.swap_column(0)
=> [[:a, 2, 3], [:b, 5, 6], [:c, 8, 9]]
m  # m is unchanged
=> #<M:0x007ffdc2952e38 @a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]], @b=[:a, :b, :c]>
于 2013-10-03T21:16:06.910 回答