更新:这不够精确。我实际拥有的是4个向量,表示2组点的x和y坐标以及一个函数,它给出了一对数作为每对点的输出(即每个点的一个点)。我想在不使用for循环的情况下编写这个计算。
例如
x1=c(0,1,2,3)
y1=c(4,5,6,7)
x2=c(1,3,5,7)
y2=c(2,4,6,8)
f=(x1+y1+x2)/y2
答案 0 :(得分:1)
可能有帮助
f1 <- function(i,j) (x1[i]+y1[i]+x2[j])/y2[j]
outer(seq_along(x1), seq_along(x2), f1)
# [,1] [,2] [,3] [,4]
#[1,] 2.5 1.75 1.500000 1.375
#[2,] 3.5 2.25 1.833333 1.625
#[3,] 4.5 2.75 2.166667 1.875
#[4,] 5.5 3.25 2.500000 2.125
set.seed(21)
x1 <- sample(1:20,1e3,replace=TRUE)
x2 <- sample(1:30, 1e3, replace=TRUE)
y1 <- sample(1:20,1e3, replace=TRUE)
y2 <- sample(1:40,1e3,replace=TRUE)
akrun <- function() {f1 <- function(i,j) (x1[i]+y1[i]+x2[j])/y2[j]
outer(seq_along(x1), seq_along(x2), f1)}
library(proxy)
JH <- function(){f <- function(a,b) (a[1]+a[2]+b[1])/b[2]
dist(cbind(x1,y1),cbind(x2,y2),method=f)}
library(microbenchmark)
microbenchmark(akrun(), JH(), unit='relative', times=20L)
# Unit: relative
# expr min lq mean median uq max neval cld
#akrun() 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 20 a
# JH() 60.40066 58.46018 58.08219 58.49396 57.10239 55.18854 20 b
答案 1 :(得分:1)
你要求的是一个&#34;距离矩阵&#34;基于用户定义的距离函数。您可以使用dist(...)
包中的proxy
轻松完成此操作。
f <- function(a,b) (a[1]+a[2]+b[1])/b[2]
library(proxy)
dist(cbind(x1,y1),cbind(x2,y2),method=f)
# [,1] [,2] [,3] [,4]
# [1,] 2.500000 1.750000 1.500000 1.375000
# [2,] 3.500000 2.250000 1.833333 1.625000
# [3,] 4.500000 2.750000 2.166667 1.875000
# [4,] 5.500000 3.250000 2.500000 2.125000
答案 2 :(得分:0)
mapply(FUN =函数(x1,y1,x2,y2)(x1 + y1 + x2)/ y2,x1 = c(0,1,2,3), y1 = c(4,5,6,7),x2 = c(1,3,5,7),y2 = c(2,4,6,8))
[1] 2.500000 2.250000 2.166667 2.125000