rozumiem jak zewnętrzna() działa w R:zewnętrzna() odpowiednik dla list zakaz wektorowych w R
> outer(c(1,2,4),c(8,16,32), "*")
[,1] [,2] [,3]
[1,] 8 16 32
[2,] 16 32 64
[3,] 32 64 128
To w zasadzie trwa 2 wektorów, znajdzie iloczyn wektorowy tych wektorów, a następnie stosuje się funkcję każda para w crossproduct.
Nie mam jednak dwóch wektorów. Mam dwie listy macierzy:
M = lista();
M[[1]] = matrix(...)
M[[2]] = matrix(...)
M[[3]] = matrix(...)
I chcę wykonać operację na mojej liście matriks. Chcę zrobić:
outer(M, M, "*")
W tym przypadku chcę wziąć iloczyn kropek z każdej kombinacji macierzy, które mam.
Faktycznie, próbuję wygenerować macierz jądra (i pisałem funkcji jądra), więc chcę zrobić:
outer(M, M, kernelFunction)
gdzie kernelFunction
oblicza odległość między moimi dwoma matrycami.
Problem polega na tym, że outer() pobiera tylko argumenty "wektorowe", a nie "listy" itp. Czy istnieje funkcja równoważąca zewnętrzną() dla elementów innych niż wektorowe?
Alternatywnie, można użyć pętli for, aby to zrobić:
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;
}
}
ale staram się tego uniknąć za konstruktem R (który może być bardziej wydajny). (Tak, wiem, że mogę zmodyfikować pętlę for w celu obliczenia macierzy diagonalnej i zaoszczędzić 50% obliczeń, ale to nie jest kod, który próbuję zoptymalizować!)
Czy to możliwe? Wszelkie przemyślenia/sugestie?