Ich weiß, wie outer() in R funktioniert:
> outer(c(1,2,4),c(8,16,32), "*")
[,1] [,2] [,3]
[1,] 8 16 32
[2,] 16 32 64
[3,] 32 64 128
Man nimmt 2 Vektoren, ermittelt das Kreuzprodukt dieser Vektoren und wendet dann die Funktion auf jedes Paar des Kreuzprodukts an.
Ich habe jedoch keine zwei Vektoren. Ich habe zwei Listen mit Matrizen:
M = Liste();
M[[1]] = matrix(...)
M[[2]] = matrix(...)
M[[3]] = matrix(...)
Und ich möchte eine Operation auf meiner Liste der Matrikeln durchführen. Das möchte ich tun:
outer(M, M, "*")
In diesem Fall möchte ich das Punktprodukt jeder Kombination von Matrizen nehmen, die ich habe.
Eigentlich versuche ich, eine Kernel-Matrix zu erzeugen (und ich habe eine Kernel-Funktion geschrieben), also möchte ich das tun:
outer(M, M, kernelFunction)
donde kernelFunction
berechnet einen Abstand zwischen meinen beiden Matrizen.
Das Problem ist, dass outer() nur "Vektor"-Argumente annimmt, nicht aber "Liste "s usw. Gibt es eine Funktion, die das Äquivalent von outer() für Nicht-Vektor-Entitäten tut?
Alternativ dazu könnte ich eine for-Schleife verwenden, um dies zu tun:
M = list() # Each element in M is a matrix
for (i in 1:numElements)
{
for (j in 1:numElements)
{
k = kernelFunction(M[[i]], M[[j]])
kernelMatrix[i,j] = k;
}
}
aber ich versuche, dies zugunsten eines R-Konstrukts zu vermeiden (das möglicherweise effizienter ist). (Ja, ich weiß, dass ich die for-Schleife ändern kann, um die Diagonalmatrix zu berechnen und 50 % der Berechnungen zu sparen. Aber das ist nicht der Code, den ich zu optimieren versuche!)
Ist dies möglich? Irgendwelche Gedanken/Vorschläge?