【问题标题】:Ruby getting the diagonal elements in a 2d ArrayRuby 获取二维数组中的对角线元素
【发布时间】:2010-03-24 09:49:49
【问题描述】:

我正在尝试我的 2D ruby​​ 数组的一些问题,当我进行数组切片时,我的 LOC 减少了很多。比如,

require "test/unit"

class LibraryTest < Test::Unit::TestCase

  def test_box
    array = [[1,2,3,4],[3,4,5,6], [5,6,7,8], [2,3,4,5]]
    puts array[1][2..3] # 5, 6
    puts array[1..2][1] # 5, 6, 7, 8
  end
end

我想知道是否有办法获得对角线切片?假设我想从 [0,0] 开始并想要一个 3 的对角线切片。然后我会从 [0,0]、[1,1]、[2,2] 中获取元素,我会得到一个像[1,4,7] 例如上面。是否有任何神奇的单行红宝石代码可以实现这一目标? 3.times 做{一些神奇的东西?}

【问题讨论】:

  • 你可能知道这一点,但puts array[1..2][1] 等价于puts array[2],而不是puts array[1..2].map{|arr| arr[1]}。我不确定使用数组数组是否是正确的做事方式,但我无法构建更好的东西。
  • 那是我的意图。但是你的回答还是很有用的。谢谢:)

标签: ruby multidimensional-array


【解决方案1】:
puts (0..2).collect { |i| array[i][i] }

【讨论】:

  • !解决方法太明显了!干得好,虽然我会用 array.size 代替 2,因为数组长度可能不同。
  • 真棒 :) 很酷的答案...... {一些神奇的东西?}在 Ruby 中很明显
  • 不错的一个实际上我需要 2 而不是 array.size 因为它可以是任何对角线/部分对角线切片:)
  • 2 仅适用于 3x3 矩阵:对于任何其他大小,请使用 array.size-1 而不是 2
【解决方案2】:

更好的可能是使用 Matrix 库的单线:

require 'matrix'
Matrix.rows(array).each(:diagonal).to_a

【讨论】:

    【解决方案3】:

    Ruby sn-p 基于 Get all the diagonals in a matrix/list of lists in Python

    这是为了得到所有的对角线。无论如何,这个想法是从不同的侧面填充数组,以便对角线在行和列中对齐:

    arr = [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [2, 3, 4, 5]]
    
    # pad every row from down all the way up, incrementing the padding. 
    # so: go through every row, add the corresponding padding it should have.
    # then, grab every column, that’s the end result.
    
    padding = arr.size - 1
    padded_matrix = []
    
    arr.each do |row|
        inverse_padding = arr.size - padding
        padded_matrix << ([nil] * inverse_padding) + row + ([nil] * padding)
        padding -= 1    
    end
    
    padded_matrix.transpose.map(&:compact)
    

    【讨论】:

      【解决方案4】:

      我正在接受@Shai 的回答,并建议让它更实用。

      首先我们初始化数组:

      arr = [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [2, 3, 4, 5]]
      

      然后我们准备用作填充的数组:

      padding = [*0..(arr.length - 1)].map { |i| [nil] * i }
      => [[], [nil], [nil, nil], [nil, nil, nil]]
      

      然后我们将填充应用于数组。如果你颠倒第一次使用 填充或第二个取决于您是要向下还是向上 对角线。

      padded = padding.reverse.zip(arr).zip(padding).map(&:flatten)
      => [[nil, nil, nil, 1, 2, 3, 4], [nil, nil, 3, 4, 5, 6, nil], [nil, 5, 6, 7, 8, nil, nil], [2, 3, 4, 5, nil, nil, nil]]
      

      然后我们按照@Shai 的解决方案进行转置:

      padded.transpose.map(&:compact)
      => [[2], [5, 3], [3, 6, 4], [1, 4, 7, 5], [2, 5, 8], [3, 6], [4]]
      

      【讨论】:

        猜你喜欢
        • 2017-11-07
        • 2011-09-03
        • 2020-07-24
        • 2021-10-10
        • 2011-01-03
        • 1970-01-01
        • 2011-05-25
        • 2016-09-25
        • 2015-02-23
        相关资源
        最近更新 更多