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
的隨機排列一個矩陣,我們採用逐列功能paired
與apply(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,] 146660
也74
不同。
'-1:長度(X)'不修改'crossprod'。它修改'x [x]'所以人們也可以這樣寫:'{y < - x [x] -1:length(x); crossprod(y)}' – jogo
謝謝。那麼它將矩陣的第一列變成一個80維矢量? – Toni
'1:length(x)'是一個具有與矩陣'x'相同數量元素的向量。對於'x [x]'它有點棘手:它使用矩陣的一維索引,結果是一個向量並且與索引'x'具有相同的長度。 – jogo