亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“*應用”家庭真的沒有矢量化嗎?

“*應用”家庭真的沒有矢量化嗎?

慕俠2389804 2019-06-28 09:53:47
“*應用”家庭真的沒有矢量化嗎?所以我們習慣于對每一個R的新用戶說apply不是矢量化的,看看帕特里克·伯恩斯r地獄第4圈“它說(我引述):一個常見的反射是在應用程序家族中使用一個函數。這不是 矢量化,是循環隱藏。..Apply函數的定義中有一個for循環。lApplication函數掩埋循環,但執行時間往往與顯式for循環大致相等。實際上,快速查看一下apply源代碼顯示了循環:grep("for", capture.output(getAnywhere("apply")), value = TRUE)## [1] "        for (i in 1L:d2) {"  "    else for (i in 1L:d2) {"好的,但是看看lapply或vapply實際上展示了一幅完全不同的畫面:lapply## function (X, FUN, ...) ## {##     FUN <- match.fun(FUN)##     if (!is.vector(X) || is.object(X)) ##        X <- as.list(X)##     .Internal(lapply(X, FUN))## }## <bytecode: 0x000000000284b618>## <environment: namespace:base>所以很明顯沒有Rfor循環隱藏在那里,而是調用內部C編寫函數。快速瀏覽兔子 孔洞顯示了幾乎相同的圖片另外,讓我們把colMeans函數,它從未被指責沒有被傳送。colMeans# function (x, na.rm = FALSE, dims = 1L) # {#   if (is.data.frame(x)) #     x <- as.matrix(x)#   if (!is.array(x) || length(dn <- dim(x)) < 2L) #     stop("'x' must be an array of at least two dimensions")#   if (dims < 1L || dims > length(dn) - 1L) #     stop("invalid 'dims'")#   n <- prod(dn[1L:dims])#   dn <- dn[-(1L:dims)]#   z <- if (is.complex(x)) #     .Internal(colMeans(Re(x), n, prod(dn), na.rm)) + (0+1i) * #     .Internal(colMeans(Im(x), n, prod(dn), na.rm))#   else .Internal(colMeans(x, n, prod(dn), na.rm))#   if (length(dn) > 1L) {#     dim(z) <- dn#     dimnames(z) <- dimnames(x)[-(1L:dims)]#   }#   else names(z) <- dimnames(x)[[dims + 1]]#   z# }# <bytecode: 0x0000000008f89d20>#   <environment: namespace:base>哈?它也只是打電話.Internal(colMeans(...我們也可以在兔洞..所以這和.Internal(lapply(..?事實上,一個快速的基準測試顯示sapply表現不遜于colMeans比for用于大數據集的循環。m <- as.data.frame(matrix(1:1e7, ncol = 1e5))system.time(colMeans(m))# user  system elapsed # 1.69    0.03    1.73 system.time(sapply(m, mean))# user  system elapsed # 1.50    0.03    1.60 system.time(apply(m, 2, mean))# user  system elapsed # 3.84    0.03    3.90 system.time(for(i in 1:ncol(m)) mean(m[, i]))# user  system elapsed # 13.78    0.01   13.93換句話說,這么說對嗎?lapply和vapply 實際上是矢量化的(與apply這是for循環,它也調用lapply帕特里克·伯恩斯到底想說什么?
查看完整描述

3 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

對我來說,矢量化主要是使代碼更易于編寫和理解。

矢量化函數的目標是消除與for循環相關的簿記。例如,而不是:

means <- numeric(length(mtcars))for (i in seq_along(mtcars)) {
  means[i] <- mean(mtcars[[i]])}sds <- numeric(length(mtcars))for (i in seq_along(mtcars)) {
  sds[i] <- sd(mtcars[[i]])}

你可以寫:

means <- vapply(mtcars, mean, numeric(1))sds   <- vapply(mtcars, sd, numeric(1))

這樣就可以更容易地看到什么是相同的(輸入數據)和什么是不同的(您正在應用的函數)。

矢量化的另一個優點是,for循環通常是用C編寫的,而不是用R編寫的,這有很大的性能優勢,但我不認為它是矢量化的關鍵屬性。矢量化從根本上講是為了拯救你的大腦,而不是拯救計算機工作。


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 559 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號