将 vector1 中的每个元素与 vector2 中的每个元素进行比较的矩阵
Matrix comparing each element in vector1 to each element in vector2
我想将一个向量 (D) 中的每个元素与另一个向量 (E) 中的每个元素进行比较,以便我得到一个维度为 length(D)xlength(E) 的矩阵。
相关比较的形式为:
abs(D[i]-E[j])<0.1
因此
D <- c(1:5)
E <- c(2:6)
我想得到
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE TRUE FALSE FALSE FALSE
[2,] FALSE FALSE TRUE FALSE FALSE
[3,] FALSE FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE TRUE
[5,] FALSE FALSE FALSE FALSE FALSE
(或 1 和 0 效果相同)
我已经能够通过做一些笨拙的事情来获得该输出:
rbind(D%in%E[1],D%in%E[2],D%in%E[3],D%in%E[4],D%in%E[5])
我可以为1:length(E)写一个循环,但是这个操作肯定有一个简单的名称和简单的代码吗?我一直在努力寻找语言来寻找这个问题的答案。
您可以使用 outer
以矢量化方式对 D
和 E
中的所有元素对执行计算:
outer(E, D, function(x, y) abs(x-y) <= 0.1)
# [,1] [,2] [,3] [,4] [,5]
# [1,] FALSE TRUE FALSE FALSE FALSE
# [2,] FALSE FALSE TRUE FALSE FALSE
# [3,] FALSE FALSE FALSE TRUE FALSE
# [4,] FALSE FALSE FALSE FALSE TRUE
# [5,] FALSE FALSE FALSE FALSE FALSE
与您在问题中包含的那种方法相比,我看到了两个好处:
- 打字少
- 效率更高:每对
x
和 y
值只调用一次该函数,因此它应该比将 E[1]
与每个元素进行比较更快D
,然后是 E[2]
,依此类推。
实际上一个直接的方法是(感谢@alexis_laz):
n = length(E)
abs(E - matrix(D, ncol=n, nrow=n, byrow=T))<0.1
# [,1] [,2] [,3] [,4] [,5]
#[1,] FALSE TRUE FALSE FALSE FALSE
#[2,] FALSE FALSE TRUE FALSE FALSE
#[3,] FALSE FALSE FALSE TRUE FALSE
#[4,] FALSE FALSE FALSE FALSE TRUE
#[5,] FALSE FALSE FALSE FALSE FALSE
我想将一个向量 (D) 中的每个元素与另一个向量 (E) 中的每个元素进行比较,以便我得到一个维度为 length(D)xlength(E) 的矩阵。
相关比较的形式为:
abs(D[i]-E[j])<0.1
因此
D <- c(1:5)
E <- c(2:6)
我想得到
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE TRUE FALSE FALSE FALSE
[2,] FALSE FALSE TRUE FALSE FALSE
[3,] FALSE FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE TRUE
[5,] FALSE FALSE FALSE FALSE FALSE
(或 1 和 0 效果相同)
我已经能够通过做一些笨拙的事情来获得该输出:
rbind(D%in%E[1],D%in%E[2],D%in%E[3],D%in%E[4],D%in%E[5])
我可以为1:length(E)写一个循环,但是这个操作肯定有一个简单的名称和简单的代码吗?我一直在努力寻找语言来寻找这个问题的答案。
您可以使用 outer
以矢量化方式对 D
和 E
中的所有元素对执行计算:
outer(E, D, function(x, y) abs(x-y) <= 0.1)
# [,1] [,2] [,3] [,4] [,5]
# [1,] FALSE TRUE FALSE FALSE FALSE
# [2,] FALSE FALSE TRUE FALSE FALSE
# [3,] FALSE FALSE FALSE TRUE FALSE
# [4,] FALSE FALSE FALSE FALSE TRUE
# [5,] FALSE FALSE FALSE FALSE FALSE
与您在问题中包含的那种方法相比,我看到了两个好处:
- 打字少
- 效率更高:每对
x
和y
值只调用一次该函数,因此它应该比将E[1]
与每个元素进行比较更快D
,然后是E[2]
,依此类推。
实际上一个直接的方法是(感谢@alexis_laz):
n = length(E)
abs(E - matrix(D, ncol=n, nrow=n, byrow=T))<0.1
# [,1] [,2] [,3] [,4] [,5]
#[1,] FALSE TRUE FALSE FALSE FALSE
#[2,] FALSE FALSE TRUE FALSE FALSE
#[3,] FALSE FALSE FALSE TRUE FALSE
#[4,] FALSE FALSE FALSE FALSE TRUE
#[5,] FALSE FALSE FALSE FALSE FALSE