Ich habe folgende Matrix / Datenrahmen:
%Vor%In diesem Fall ist N = 5 (Anzahl der Zeilen = Anzahl der Spalten). Ich möchte die fehlenden Werte in dieser symmetrischen Matrix (e [1,2] = e [2,1] usw.) ausfüllen. Gibt es einen möglichst effizienten Weg, die fehlenden Werte (N die Matrixgröße in meinem Fall ziemlich groß) auszufüllen? Gibt es einen besseren Weg als verschachtelte Schleifen?
Nur zur Fertigstellung möchte ich diese Technik zeigen. Die Addition der Transponierung wird nicht funktionieren, wenn der untere Teil der Matrix (unter der Diagonalen) Werte enthält, die sie zum oberen Teil der Matrix hinzufügen.
Mit dem Matrix-Paket können wir eine spärliche Matrix erzeugen, die im Falle der Erzeugung der Symmetrie einer großen Matrix viel weniger Speicher benötigt und sie sogar beschleunigt.
Um eine symmetrische dünn besetzte Matrix aus der Matrix e
zu erstellen, würden wir tun:
Ausgabe:
%Vor%Mikrobenmark:
Nehmen wir eine Funktion, um eine symmetrische Matrix aus einer Matrix zu machen (kopiert standardmäßig den oberen Teil der Matrix in den unteren):
%Vor%Und testen:
%Vor% Wie Sie sehen können, ist symmetrise
tatsächlich viel langsamer als e + t(e)
oder df[lower.tri(df)] <- t(df)[lower.tri(df)]
, aber zumindest haben Sie eine Funktion, die automatisch eine Matrix symmetriert (nimmt den oberen Teil und erstellt standardmäßig den niedrigeren) und falls Sie Haben Sie eine große Matrix, wo Speicher ein Problem ist, könnte dies nützlich sein.
P.S. Wo immer Sie .
in der Matrix sehen, ist dies eine Null. Durch die Verwendung eines anderen Systems ist eine dünn besetzte Matrix eine Art "komprimiertes" Objekt, das die Speichereffizienz erhöht.
Auch für die Geschwindigkeit:
%Vor%Hier ist ein Maßstab:
%Vor%Es kann diese Geschwindigkeit erhalten, weil es direkt eine symmetrische Matrix erzeugt.