【问题标题】:Set all values of a column in a multidimensional array设置多维数组中某一列的所有值
【发布时间】:2014-04-01 23:46:25
【问题描述】:

我有以下代码将零添加到多维数组中特定行的值:

def self.zero_row(matrix, row_index)
    matrix[row_index].each_with_index do |item, index|
      matrix[row_index][index] = 0
    end
    return matrix
end

我想知道如何将给定特定 column_index 的所有值设为零。

def self.zero_column(matrix, col_index)
  #..
end

【问题讨论】:

  • sawa,如何在平面数组中构造矩阵?
  • 我已将我的 cmets 移至答案。

标签: ruby arrays multidimensional-array


【解决方案1】:

要遵循与其他方法相同的模式,您可以执行以下操作:

def self.zero_column(matrix, col_index)
  matrix.each_with_index do |item, row_index|
    matrix[row_index][col_index] = 0
  end
end

【讨论】:

    【解决方案2】:

    这符合要求吗?

    def self.zero_column(matrix, col_index)
      matrix = matrix.transpose
      matrix[col_index].map!{0}
      matrix.transpose
    end
    

    同样,您可以简化您的 zero_row 方法

    def self.zero_row(matrix, row_index)
      matrix[row_index].map!{0}
      matrix
    end
    

    【讨论】:

    • 我按照matrix[col_index] = [0]*matrix[0].size 的思路思考,但map!{0} 肯定更好。我认为只要矩阵不太大,使用transpose 就可以了,但是@Alex 的解决方案对于更大的矩阵会更有效(即使transpose 是用C 编码的)。有意义吗?
    • @CarySwoveland 我在想transposemap! 内部的C 编码将胜过Ruby 解释器中的显式迭代。在某个时候,我应该对其进行基准测试并找出答案,只是现在没有时间。我完全期望基于map!zero_row 实现应该是迭代版本的赢家。
    • @CarySwoveland 基准测试结果在 - 对于 100x100 矩阵,zero_row 的基于地图的版本快两倍,但zero_column 中的双转置使它慢了 30 倍.
    • pjs,谢谢你这样做。这是有道理的,当然zero_column 的因子 30 会随着矩阵的大小而增加。
    【解决方案3】:

    如果你需要经常处理列,那么我会说使用嵌套数组是一个设计缺陷。嵌套数组几乎没有任何好处,只会让事情变得复杂。你最好有一个平面阵列。将列与具有平面数组的行同等地操作要容易得多。

    如果你想要一个 3 x 2 矩阵,那么你可以简单地将它初始化为一个长度为 3 * 2 的数组,例如:

    a = [1, 2, 3, 4, 5, 6]
    

    然后,您可以分别引用第二列(索引 1)或行:

    a.select.with_index{|_, i| i % 2 == 1} # => [2, 4, 6]
    a.select.with_index{|_, i| i / 2 == 1} # => [3, 4]
    

    将该列或行的所有值重写为0 将分别为:

    a.each_index{|i| a[i] = 0 if i % 2 == 1} # => a: [1, 0, 3, 0, 5, 0]
    

    a.each_index{|i| a[i] = 0 if i / 2 == 1} # => a: [1, 2, 0, 0, 5, 6]
    

    在对列的操作和对行的另一个操作之间切换将是在%/ 之间切换的问题;你可以看到对称性/一致性。如果您需要将有关列长度2 的信息保留在数组中,则只需将其分配为该数组的实例变量即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多