Der Standard-R-Ausdruck outer(X, Y, f)
ergibt eine Matrix, deren (i, j) -ter Eintrag den Wert f(X[i], Y[j])
hat.
Ich möchte die Funktion multi.outer
implementieren, eine n-dimensionale Verallgemeinerung von outer
: multi.outer(f, X_1, ..., X_n)
, wobei f eine n-ary Funktion ist, würde a (Länge (X_1) * ... * Länge (X_n)) Array, dessen (i_1, ..., i_n) -ter Eintrag den Wert f(X_1[i_1], ..., X_n[i_n])
für alle gültigen Indexmengen (i_1, ..., i_n) hat. Natürlich müssen für jedes i in {1, ..., n} alle Elemente von X_i
in multi.outer(f, X_1,...,X_i,..., X_n)
zulässige i-te Argumente für die Funktion f
sein. Für den Fall n = 2 würde multi.outer
dasselbe tun wie outer
, obwohl es eine andere Signatur hätte (IOW, multi.outer(f, X, Y)
wäre äquivalent zu outer(X, Y, f)
).
Es ist wichtig zu beachten, dass, obwohl die Argumente X_1, ..., X_n von multi.outer
alle Vektoren sind, sie nicht notwendigerweise alle denselben Modus haben. Z.B. X_1 und X_2 könnten c(1, 2, 3)
bzw. LETTERS[10:20]
sein.
Danke!
Dies ist eine Möglichkeit: Verwenden Sie zuerst Vectorize
und outer
, um eine Funktion zu definieren, die eine n-dimensionale Matrix erstellt, in der jeder Eintrag eine Liste von Argumenten enthält, auf die die angegebene Funktion angewendet wird:
Jetzt muss multi.outer
nur apply
und do.call
auf dieser "args-matrix" aufrufen:
Versuchen wir das mit einer Beispielfunktion:
%Vor%Ich denke, wir können das mit Outer und Vectorize machen.
%Vor%Jetzt gibt sigm1 (x = 1: 3) die gewünschte Ausgabe
%Vor%Der einzige Nachteil bei diesem Code-Snippet ist, dass ich die Standardwerte von a = -1: 1 und b = -1: 1 verwende. Wenn ich versuche, während des Funktionsaufrufs dasselbe zu tun, geht es drunter und drüber. ZB
%Vor%Ich bin nicht imstande herauszufinden, warum die Übergabe der Argumente diesen Unterschied in der Ausgabe macht.
Tags und Links r reduce outer-join vectorization