2016-04-05 19 views
1

ich diese Matrix-Klasse bin mit: http://ruby-doc.org/stdlib-2.0.0/libdoc/matrix/rdoc/Matrix.htmlErste zwei Diagonalen einer Matrix

ich es auf diese Weise bin Instanziierung:

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

Wie kann ich die Elemente aus beiden Diagonalen bekommen? Ich fand ich die Elemente von links oben nach rechts unten diagonal diese Weise erhalten kann:

@matrix.each(:diagonal).to_a 

Aber ich kann nicht einen Weg finden, um die Elemente in der oberen rechten Ecke bekommen diagonal nach links unten.

Antwort

2

Diagonal:

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

Ober right⇒lower links diagonal:

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

prüfen @matrix.square? stellt sicher, dass die Diagonale existiert, nachdem alle.

3

Angenommen:

require 'matrix' 

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

die Hauptdiagonale zu erhalten ist einfach. Lass es uns eine Matrix Methode machen.

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

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

Eine Möglichkeit, die antidiagonal 1 zu erhalten, ist die Matrix „90 Grad“ zu drehen und dann die Hauptdiagonale dieser Matrix. Um die Drehung ausführen, hier ist eine andere Matrix Methode, die ich habe in verschiedenen Situationen nützlich gefunden:

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

Zum Beispiel:

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

Die antidiagonal von m ist daher:

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

1. Nach Wiki ist die Diagonale, die von oben links nach unten rechts einer quadratischen Matrix verläuft, die "ma in Diagonale (manchmal Hauptdiagonale, Hauptdiagonale, Hauptdiagonale oder Hauptdiagonale), während die Diagonale, die von oben rechts nach unten links geht, die "antidiagonale (manchmal gegendiagonale, sekundäre Diagonale, hintere Diagonale oder kleine Diagonale)" ist.

Verwandte Themen