我试图在以下函数中拆分以下代码:
paired <- function(x) crossprod(x[x]-1:length(x))==0
对于上下文,这出现在this answer in CV。
我们有一个由10个8维向量组成的矩阵,对应于向量1:8
的随机排列
n <- 8
x <- replicate(10, sample(1:n, n))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 3 5 2 5 1 8 8 3
[2,] 4 3 5 4 3 8 5 2 1 8
[3,] 5 5 4 3 8 2 6 3 6 7
[4,] 6 8 1 7 4 3 8 6 2 2
[5,] 7 4 8 2 7 4 4 1 3 4
[6,] 2 6 2 6 5 1 3 4 7 6
[7,] 8 2 7 8 1 6 7 5 5 1
[8,] 3 7 6 1 6 7 2 7 4 5
我们使用paired
逐列地应用函数apply(x, 2, paired)
获取布尔运算的结果,我猜测是否function(x) crossprod(x[x]-1:length(x))
的任何结果等于零:< / p>
intermediate <- function(x) crossprod(x[x]-1:length(x))
apply(x, 2, intermediate)
[1] 74 80 88 88 100 108 26 90 124 106
apply(x, 2, paired)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
intermediate
调用中的值不是列x[x] - 1
中列向量与自身的点积,对于第一列,它们将是:
> w <- c(1,4,5,6,7,2,8,3)
> v <- w[w] - 1
> t(v)%*%v
[,1]
[1,] 140
而不是74
。
问题是,length(x)
在修改crossprod()
方面的作用是什么?
编辑:在评论之后(谢谢),如果我尝试代码:
w <- c(1,4,5,6,7,2,8,3)
v <- w[w] - 1:length(x)
t(v)%*%v
我的crossprod(v) [1,] 146660
也与74
不同。
答案 0 :(得分:2)
请勿在{{1}}功能的crossprod
上过度挂断。它所做的只是检查paired
是否为零向量(即“完美配对”的条件)。它的编码方式可能不同且更快(请参阅x[x] - 1:length(x)
或paired2
):
paired3