Ich versuche, alle möglichen Zeichen einzufügen, die in einer beliebigen Diagonalen innerhalb einer N * N-Matrix angeordnet sind.
Betrachten Sie zum Beispiel die folgende 3 x 3-Matrix:
%Vor%In der obigen Matrix muss ich die Diagonalen einfügen: "see", "fey", "ees" und "yef". Ich kann diese im Datenrahmen mit dem folgenden Code finden:
%Vor%Das Problem ist, dass ich das automatisieren möchte, damit es auf jeder N x N-Matrix funktioniert. (Ich schreibe eine Funktion, um die Diagonalen in jeder N X N-Matrix zu finden). Gibt es einen effizienten Weg, dies zu tun?
Oh, das ist einfach, wenn Sie Matrix anstelle von data.frame verwenden :) Wir können Matrixelemente genauso wie Vektorelemente auswählen:
%Vor%So können wir jetzt das verwenden:
%Vor% Und wenn Sie es rückwärts wollen, kehren Sie einfach den Vektor der Indizes mit rev
function:
Einige Benchmarks:
%Vor% Für eine Matrix kann dies erreicht werden, indem die diag
der vier möglichen Rotationen genommen werden. Wenn Sie eine Rotationsfunktion wie folgt einrichten ( Guthaben ), wird dies einfach:
Wie von Frank in Kommentaren hervorgehoben, könnte dies bei ausreichend großen Matrizen langsam werden (auf meiner Maschine beginnt rotate
länger als etwa eine Sekunde bei Matrizen größer als 1000 X 1000). Sie können etwas Zeit sparen, indem Sie rev
vor dem Einfügen verwenden, zB:
Eine Möglichkeit ist die Verwendung von diag
in der Matrix, hier mat
genannt, um Konflikte mit dem Funktionsnamen zu vermeiden und die Reihen- und / oder Spaltenreihenfolge für jede Diagonale und Richtung umzukehren.
Sie können es mit einer zusätzlichen Funktion tun, um die Umkehrungen systematisch zu machen, so dass Sie sapply
zum Schleifen verwenden können.
Konvertiere matrix
in eine tatsächliche Matrix m
(im Gegensatz zu einem Datenrahmen). Dann sind die vier Diagonalen: