【发布时间】:2009-11-12 02:07:18
【问题描述】:
我了解 outer() 在 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 = 列表();
M[[1]] = matrix(...)
M[[2]] = matrix(...)
M[[3]] = matrix(...)
我想对我的矩阵列表进行操作。我想做:
outer(M, M, "*")
在这种情况下,我想取每个矩阵组合的点积。
其实我是在尝试生成一个核矩阵(而且我已经写了一个核函数),所以我想做:
outer(M, M, kernelFunction)
kernelFunction 计算我的两个矩阵之间的距离。
问题是outer() 只接受“向量”参数,而不是“列表”等。有没有一个函数可以对非向量实体执行相当于outer() 的函数?
或者,我可以使用 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% 的计算量。但这不是我要优化的代码!)
这可能吗?有什么想法/建议吗?
【问题讨论】:
标签: r