Я понимаю, как external () работает в 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
Это в основном занимает 2 вектора, находит перекрестный продукт этих векторов и затем применяет функцию к каждой паре в перекрестном продукте.
Однако у меня нет двух векторов. У меня есть два списка матриц:
M = list ();
M[[1]] = matrix(...)
M[[2]] = matrix(...)
M[[3]] = matrix(...)
И я хочу сделать операцию в моем списке матриц. Я хочу сделать:
outer(M, M, "*")
В этом случае я хочу взять скалярное произведение каждой имеющейся у меня комбинации матриц.
На самом деле я пытаюсь сгенерировать матрицу ядра (и я написал функцию ядра), поэтому я хочу сделать:
outer(M, M, kernelFunction)
где kernelFunction
вычисляет расстояние между моими двумя матрицами.
Проблема в том, что external () принимает только «векторные» аргументы, а не «list» и т. Д. Есть ли функция, которая делает эквивалент external () для не векторных объектов?
С другой стороны, я мог бы использовать цикл for для этого:
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;
}
}
но я пытаюсь избежать этого в пользу конструкции R (которая может быть более эффективной). (Да, я знаю, что могу изменить цикл for для вычисления диагональной матрицы и сэкономить 50% вычислений. Но это не тот код, который я пытаюсь оптимизировать!)
Возможно ли это? Есть мысли / предложения?