我在我的大學使用計算機羣集時出現矩陣錯誤,無法在本地計算機上重現。我認爲這可能是由於矩陣庫(BLAS,LAPACK,ATLAS等)的不同所致。我不知道很多關於比我讀過here等這些庫,但我想應該有一個辦法讓R鍵告訴我哪個矩陣庫,它與(它的使用即哪些)安裝,類似於到sessionInfo()告訴我它正在使用哪個版本的R包。如何確定我的R安裝使用哪個矩陣庫?
回答
雖然有可能不是這個明確的一個R函數,也許你可以在shell命令利用(如,file
和ldd
),以獲得一些線索,而無需在集羣上重建[R也沒有root訪問權限:
(rpath <- Sys.which("R"))
# R
# "/usr/bin/R"
爲了確保ldd
將工作,看看它是什麼類型的文件:
system2("file", rpath)
# /usr/bin/R: Bourne-Again shell script, ASCII text executable
如果你的顯示一個實際的可執行文件(例如ELF 64-bit LSB executable, x86-64, ...
),那麼跳過這一步。
script <- readLines(rpath)
script[grepl("/bin/", script)]
# [1] "#!/bin/bash"
# [2] " if [ -x \"/usr/${libnn}/R/bin/exec/R\" ]; then"
# [3] " elif [ -x \"/usr/${libnn_fallback}/R/bin/exec/R\" ]; then"
# [4] "## some systems have a more portable sed, e.g. /usr/xpg4/bin/sed on Solaris,"
# [5] "SED=/bin/sed"
# [6] " exec sh \"${R_HOME}/bin/Rcmd\" \"${@}\" ;;"
# [7] "R_binary=\"${R_HOME}/bin/exec${R_ARCH}/R\""
這告訴我,實際可執行文件/usr/lib/R/bin/exec/R
(或/usr/lib64/...
)。它正在進行一些推斷,但這只是一步。這對於我在Ubuntu上使用R-3.3.2是很有幫助的,所以我只能假設它在不同的操作系統上會類似。如果這不具有信息性,則還可以grep for "/lib"
或"/exec"
(或者僅檢查整個腳本文件以獲取其他線索)。
一旦你知道通過腳本調用路徑(如果它不是一開始就有一個腳本),找到共享庫的依賴關係:
system2("ldd", "/usr/lib/R/bin/exec/R")
# linux-vdso.so.1 => (0x00007ffcfadcd000)
# libR.so => /usr/lib/R/lib/libR.so (0x00007f746f615000)
# libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f746f3eb000)
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f746f025000)
# libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f746eda8000)
# libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f746eaa2000)
# libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f746e85b000)
# libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f746e61d000)
# liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f746e3fb000)
# libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f746e1ea000)
# libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f746dfd1000)
# librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f746ddc9000)
# libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f746dbc4000)
# libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f746d9b5000)
# /lib64/ld-linux-x86-64.so.2 (0x0000560abd5fa000)
# libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f746d78b000)
此輸出的第五行表明,R是使用BLAS庫,特別是libblas3
。
感謝您的回覆。從我閱讀這篇文章的時候,它提供了關於如何用不同的矩陣庫構建R的信息,但是無法找出現有構建中使用哪個矩陣庫。 – rcorty 2015-03-31 16:42:22
的據我所知,沒有一個特定的功能(尤其不要在基礎R),這將使你的BLAS版本。 R很可能會使用系統附帶的標準庫(除非有人使用特定的BLAS版本從源代碼構建)。
你不得不從終端做到這一點,類型
locate libblas.so
它可能要在/usr/lib/libblas.so
或/usr/lib64/libblas.so
,地點可能是一個符號鏈接。所以,按照鏈接
ls -l /usr/lib/libblas.so
如果你想改變的符號鏈接指向一個不同的BLAS庫,你可以做 update-alternatives --config libblas.so.3gf
並選擇要使用的版本。這篇文章更詳細地解釋了它:https://www.r-bloggers.com/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/
另一種明確知道你正在使用的版本的方法是安裝你想要的任何BLAS實現 - 例如OpenBLAS,然後用標準R BLAS庫替換符號鏈接到您的新庫。確保用--with-shared-blas
選項來安裝R,在這裏解釋:https://cran.r-project.org/doc/manuals/r-release/R-admin.html#BLAS 然後你只需要:
# navigate to your R directory
cd …/path-to-R-installation/lib/R/lib
# backup the original
mv libRblas.so libRblas.backup
# create simlink
ln –s …/path-to-new-0blas-library/new-lib.so libRblas.so
- 1. 如何用R中另一個矩陣的值填充矩陣?
- 2. 我如何確定我能正確安裝LAPACK和犰狳庫?
- 3. SSRS - 如何確定在矩陣控制中訪問哪個列?
- 4. 如何整合兩個矩陣的信息使用一個矩陣圖R
- 5. 使用R中的apply()矩陣乘以三個矩陣列表?
- 6. 如何確定安裝了哪個版本的Direct3D?
- 7. 如何在R中的數據框內封裝一個矩陣?
- 8. 安裝r庫
- 9. 我的WordPress安裝使用哪個MySQL數據庫?
- 10. R - 「應用」2個矩陣
- 11. 類似於R矩陣庫的Csharp稀疏矩陣庫?
- 12. 要使用哪個數據庫以及如何在安裝時進行安裝?
- 13. R:使用過渡矩陣
- 14. 如何用R中的數值矩陣創建二元矩陣?
- 15. 我如何確定我有什麼庫可用/如何安裝boost?
- 16. 確定一個矩陣是肯定的
- 17. 如何確定R使用哪個並行處理包?
- 18. 如何從矩陣R中
- 19. 如何將多個矩陣幀合併爲一個使用R?
- 20. 如何確定打印機安裝在哪個服務器上
- 21. 如何從Java內部確定安裝了哪個.NET框架
- 22. 如何確定在SQL Server上安裝了哪個Service Pack?
- 23. 如何檢測/確定安裝了哪個SLT版本
- 24. 過濾器:如何確定採取哪種掩模矩陣
- 25. 如何「自定義」我的元素矩陣R
- 26. R - 如何使用R標準化矩陣中的值
- 27. 確定安裝哪些R體系結構
- 28. 矩陣乘法在不同R安裝中的性能
- 29. 使用Matlab計算矩陣sim R R
- 30. 確定使用單應矩陣(AR)
感謝您的詳細解答。我從來都不會自己弄明白。令人遺憾的是R沒有「關於我」的功能,比如「R --version」,但也許它可以被稱爲「R --buildoptions」。 – rcorty 2017-01-13 13:39:19