获得矩阵的两个对角线

时间:2016-04-05 05:26:28

标签: ruby matrix

我正在使用此Matrix类:http://ruby-doc.org/stdlib-2.0.0/libdoc/matrix/rdoc/Matrix.html

我以这种方式实例化:

@matrix = Matrix.build(3,3) { |row, col| Cell.new }

如何从两个对角线中获取元素?我发现我可以通过这种方式从左上角到右下角找到元素:

@matrix.each(:diagonal).to_a

但是我无法找到一种方法将右上角的元素放到左下角。

2 个答案:

答案 0 :(得分:3)

对角线:

@matrix.square? && (0...@matrix.row_size).map { |i| @matrix[i, i] }

右上⇒左下对角线:

@matrix.square? && (0...@matrix.row_size).map do |i|
  @matrix[i, @matrix.row_size - 1 - i]
end

检查@matrix.square?确保对角线存在,毕竟。

答案 1 :(得分:3)

假设:

require 'matrix'

m = Matrix[[1,2,3],
           [4,5,6],
           [7,8,9]]
  #=> Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

获得主对角线很容易。让它成为Matrix方法。

class Matrix
  def extract_diagonal
    each(:diagonal).to_a
  end
end

m.extract_diagonal
  # => [1, 5, 9]

获得反对角线 1 的一种方法是将矩阵旋转“90度”,然后取该矩阵的主对角线。为了执行旋转,这是我在各种情况下发现的另一种Matrix方法:

class Matrix
  def rotate
    Matrix[*to_a.map(&:reverse).transpose]
  end
end

例如:

m.rotate
  #=> Matrix[[3, 6, 9],
  #          [2, 5, 8],
  #          [1, 4, 7]] 

因此m的反对角线是:

m.rotate.extract_diagonal
  #=> [3, 5, 7] 

1。根据{{​​3}},从方形矩阵的左上角到右下角的对角线是“主对角线(有时是主对角线,主对角线,前导对角线或主要对角线)”,而对角线则是从右上角到左下角的是“反对角线(有时是对角线,次要对角线,尾随对角线或小对角线)”。