将属性向量转化为元素不同的矩阵

Transform attribute vector into a matrix with differences of elements

与此类似 我需要将属性向量转换为矩阵。这次使用 R.

的元素对之间存在差异

例如,我有一个向量,它报告 N 个人的年龄(从 18 岁到 90 岁)。我需要将这个向量转换成一个名为 A 的 NxN 矩阵(行和列上都有人名),其中每个单元格 Aij 的值为 |age_i-age_j|,代表 i 和 i 两个人之间的绝对年龄差j.

这是一个有 3 个人的例子,第一个 18 岁,第二个 23 岁,第三个 60 岁,产生这个向量:

c(18, 23, 60) 

我想把它转换成这个矩阵:

A = matrix( c(0, 5, 42, 5, 0, 37, 42, 37, 0), nrow=3, ncol=3, byrow = TRUE) 
tmp <- c(18, 23, 60)

您可以使用 dist 和几个参数:

dist(tmp, upper=TRUE, diag=TRUE)
   1  2  3
1  0  5 42
2  5  0 37
3 42 37  0

请注意,dist 函数 returns 是一个 "dist" 对象,因此您可能希望将其强制转换为具有 as.matrix 的矩阵。然后你可以放弃参数:

as.matrix(dist(tmp))
   1  2  3
1  0  5 42
2  5  0 37
3 42 37  0

或再次使用outer。给它输入减法运算符,然后取绝对值。

abs(outer(tmp, tmp, "-"))

     [,1] [,2] [,3]
[1,]    0    5   42
[2,]    5    0   37
[3,]   42   37    0

据推测,dist 将比 outer 更快,因为该算法可以利用此类计算中存在的对称性,而 outer 更通用。