R语法

时间:2015-12-17 18:25:10

标签: r cross-product

我试图在以下函数中拆分以下代码:

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不同。

1 个答案:

答案 0 :(得分:2)

请勿在{{1​​}}功能的crossprod上过度挂断。它所做的只是检查paired是否为零向量(即“完美配对”的条件)。它的编码方式可能不同且更快(请参阅x[x] - 1:length(x)paired2):

paired3