2015-12-17 61 views
1

我試圖掰開下面的函數下面的代碼:crossprod()中的R語法

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 

的隨機排列一個矩陣,我們採用逐列功能pairedapply(x, 2, paired)得到一個布爾運算,結果我猜評估是否有任何function(x) crossprod(x[x]-1:length(x))的結果等於零:在intermediate通話

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 

的值而不是列VEC的點積職權範圍在縱列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,] 14666074不同。

+0

'-1:長度(X)'不修改'crossprod'。它修改'x [x]'所以人們也可以這樣寫:'{y < - x [x] -1:length(x); crossprod(y)}' – jogo

+0

謝謝。那麼它將矩陣的第一列變成一個80維矢量? – Toni

+0

'1:length(x)'是一個具有與矩陣'x'相同數量元素的向量。對於'x [x]'它有點棘手:它使用矩陣的一維索引,結果是一個向量並且與索引'x'具有相同的長度。 – jogo

回答

2

請勿在paired函數中crossprod上掛得過多。它所要做的就是檢查x[x] - 1:length(x)是否爲零向量(即「完美配對」的條件)。它可以有不同的編碼和更快的(見paired2paired3):

> n <- 8 
> set.seed(17) 
> x <- replicate(1e6, sample(1:n, n)) 
> 
> paired <- function(x) crossprod(x[x] - 1:length(x))==0 
> paired2 <- function(x) sum(x[x]==1:length(x))==length(x) 
> paired3 <- function(x) sum(abs(x[x]-1:length(x)))==0 
> 
> system.time(i.paired <- apply(x, 2, paired)) 
    user system elapsed 
    9.812 0.000 9.821 
> system.time(i.paired2 <- apply(x, 2, paired2)) 
    user system elapsed 
    4.548 0.000 4.550 
> system.time(i.paired3 <- apply(x, 2, paired3)) 
    user system elapsed 
    4.617 0.000 4.617 
> 
> all.equal(i.paired,i.paired2) 
[1] TRUE 
> all.equal(i.paired,i.paired3) 
[1] TRUE