Ich verstehe, wie outer () in R funktioniert:
%Vor%Es benötigt grundsätzlich zwei Vektoren, findet das Kreuzprodukt dieser Vektoren und wendet dann die Funktion auf jedes Paar im Kreuzprodukt an.
Ich habe jedoch keine zwei Vektoren. Ich habe zwei Listen von Matrizen:
M = Liste ();
%Vor%Und ich möchte eine Operation auf meiner Matrizenliste machen. Ich möchte tun:
%Vor%In diesem Fall möchte ich das Skalarprodukt jeder Kombination von Matrizen nehmen, die ich habe.
Eigentlich versuche ich eine Kernel-Matrix zu erzeugen (und habe eine Kernel-Funktion geschrieben), also möchte ich folgendes tun:
%Vor% wobei kernelFunction
einen Abstand zwischen meinen beiden Matrizen berechnet.
Das Problem ist, dass outer () nur "Vektor" -Argumente anstelle von "Listen" usw. verwendet. Gibt es eine Funktion, die das Äquivalent von outer () für Nicht-Vektor-Entitäten ausführt?
Alternativ könnte ich eine for-Schleife dazu verwenden:
%Vor%aber ich versuche, dies zugunsten eines R-Konstrukts zu vermeiden (was effizienter sein könnte). (Ja, ich weiß, dass ich die For-Schleife modifizieren kann, um die diagonale Matrix zu berechnen und 50% der Berechnungen zu speichern. Aber das ist nicht der Code, den ich zu optimieren versuche!)
Ist das möglich? Irgendwelche Gedanken / Vorschläge?
Benutze einfach die for-Schleife. Alle eingebauten Funktionen werden auf diese Weise entartet, und Sie verlieren die Klarheit des Ausdrucks, es sei denn, Sie erstellen sorgfältig eine Funktion, die outward generalisiert, um mit Listen zu arbeiten.
Die größte Verbesserung, die Sie machen könnten, wäre die Vorabzuordnung der Matrix:
%Vor%PS. Eine Liste ist ein Vektor.
Die äußere Funktion funktioniert tatsächlich auf Listen, aber die Funktion, die Sie zur Verfügung stellen, bekommt die zwei Eingabevektoren wiederholt, so dass sie alle möglichen Kombinationen enthalten ...
Was ist schneller, die Kombination von äußeren mit vapply ist 3x schneller als die doppelte for-Schleife auf meinem Rechner. Wenn die tatsächliche Kernel-Funktion "wirklich funktioniert", ist der Unterschied in der Schleifengeschwindigkeit wahrscheinlich nicht so wichtig.
%Vor%Tags und Links r