簡體   English   中英

Rcpp如何檢查矢量/矩陣邊界?

[英]How does Rcpp check Vector/Matrix boundaries?

我正在嘗試使用Rcpp來查看邊界檢查的工作原理:

> cppFunction ('double fun(){NumericVector v(5); return v[-10];}', rebuild=T)
> fun()
[1] 1.782105e-316
> cppFunction ('double fun(){NumericVector v(5); return v[5];}', rebuild=T)
> fun()
[1] 5.323385e-316

> cppFunction ('NumericVector fun(){NumericMatrix v(5, 5); return v(6,_);}', rebuild=T)
> fun()
Error: index out of bounds
> cppFunction ('double fun(){NumericMatrix v(5, 5); return v(6,1);}', rebuild=T)
> fun()
[1] 0

我真的不明白它是如何工作的。 我期望所有這四個都出現“索引超出范圍”錯誤。 我該怎么做才能使其始終對向量和矩陣都有效? 這是編譯時的一些詳細輸出:

Generated R functions 
-------------------------------------------------------

`.sourceCpp_81484_DLLInfo` <- dyn.load('/tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d/sourceCpp_20261.so')

fun <- Rcpp:::sourceCppFunction(function() {}, FALSE, `.sourceCpp_81484_DLLInfo`, 'sourceCpp_81484_fun')

rm(`.sourceCpp_81484_DLLInfo`)

Building shared library
--------------------------------------------------------

DIR: /tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d

/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_20261.so' --preclean 'file5b0652a2d520.cpp' 
g++ -I/usr/share/R/include -DNDEBUG    -I"/home/user/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include" -fpic  -O3 -pipe  -g  -c file5b0652a2d520.cpp -o file5b0652a2d520.o
g++ -shared -o sourceCpp_20261.so file5b0652a2d520.o -L/usr/lib/R/lib -lR

我是否需要修改-O3或-DNDEBUG參數?

對於前兩個示例,沒有邊界檢查。 邊界檢查很昂貴。 您得到的是未定義的行為。 這種情況下的症狀是您得到垃圾,但也可能遇到段錯誤。

您的第三個示例使用_占位符提取一行。 在構造代表行概念的MatrixRow對象時,將拋出異常,因為沒有這樣的行。 您可以認為這里值得進行邊界檢查,因為它檢查了“整行”。

您的最后一個示例看起來像一個錯誤。 可能在Vector :: offset

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM