gpt4 book ai didi

r - 对于 R 中的非向量列表,outer() 等效

转载 作者:行者123 更新时间:2023-12-04 09:02:13 26 4
gpt4 key购买 nike

我理解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() 只接受“向量”参数,而不是“列表”等。是否有一个函数可以对非向量实体执行与外层()等效的功能?

或者,我可以使用 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% 的计算。但这不是我要优化的代码!)

这可能吗?有什么想法/建议吗?

最佳答案

只需使用 for 循环。任何内置函数无论如何都会退化为那个,并且您将失去表达的清晰度,除非您仔细构建一个将外部泛化为与列表一起使用的函数。

您可以做出的最大改进是预分配矩阵:

M <- list()
length(M) <- numElements ^ 2
dim(M) <- c(numElements, numElements)

附注。列表是一个向量。

关于r - 对于 R 中的非向量列表,outer() 等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1719447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com