第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

RCPP通過(guò)引用與按值傳遞

RCPP通過(guò)引用與按值傳遞

HUX布斯 2019-12-05 16:07:52
我通過(guò)第一次對(duì)Rcpp函數(shù)進(jìn)行了測(cè)試inline,它解決了我的速度問(wèn)題(感謝Dirk!): R:將負(fù)值替換為零初始版本如下所示:library(inline)cpp_if_src <- '  Rcpp::NumericVector xa(a);  int n_xa = xa.size();  for(int i=0; i < n_xa; i++) {    if(xa[i]<0) xa[i] = 0;  }  return xa;'cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")但是,當(dāng)調(diào)用時(shí)cpp_if(p),它會(huì)覆蓋p輸出,這與預(yù)期不符。因此,我認(rèn)為它是通過(guò)引用傳遞的。所以我用以下版本修復(fù)了它:library(inline)cpp_if_src <- '  Rcpp::NumericVector xa(a);  int n_xa = xa.size();  Rcpp::NumericVector xr(a);  for(int i=0; i < n_xa; i++) {    if(xr[i]<0) xr[i] = 0;  }  return xr;'cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")這似乎工作。但是現(xiàn)在當(dāng)我將其重新加載到R中時(shí),原始版本不再覆蓋其輸入(即,相同的精確代碼現(xiàn)在也不會(huì)覆蓋其輸入):> cpp_if_src <- '+   Rcpp::NumericVector xa(a);+   int n_xa = xa.size();+   for(int i=0; i < n_xa; i++) {+     if(xa[i]<0) xa[i] = 0;+   }+   return xa;+ '> cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")> > p [1] -5 -4 -3 -2 -1  0  1  2  3  4  5> cpp_if(p) [1] 0 0 0 0 0 0 1 2 3 4 5> p [1] -5 -4 -3 -2 -1  0  1  2  3  4  5我不是唯一嘗試復(fù)制此行為并發(fā)現(xiàn)不一致結(jié)果的人:http://chat.stackoverflow.com/transcript/message/4357344#4357344這里發(fā)生了什么?
查看完整描述

2 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

它們的關(guān)鍵是“代理模型”-您xa的存儲(chǔ)位置確實(shí)與原始對(duì)象相同,因此最終需要更改原始對(duì)象。


如果您不希望這樣做,則應(yīng)該做一件事:使用該clone()方法進(jìn)行(深度)復(fù)制,或者顯式創(chuàng)建一個(gè)新對(duì)象,將更改后的對(duì)象寫入該對(duì)象。方法二不能做到這一點(diǎn),您只需使用兩個(gè)名稱不同的變量,它們都是原始變量的“指針”(就代理模型而言)。


但是,當(dāng)您將int向量(從R)傳遞給NumericVector類型時(shí),隱式轉(zhuǎn)換和復(fù)制會(huì)帶來(lái)另外的復(fù)雜性:創(chuàng)建一個(gè)副本,然后不再更改原始副本。


這是一個(gè)更明確的示例,類似于我在教程或研討會(huì)中使用的示例:


library(inline)

f1 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='

  Rcpp::NumericVector xa(a);

  int n = xa.size();

  for(int i=0; i < n; i++) {

    if(xa[i]<0) xa[i] = 0;

  }

  return xa;

')


f2 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='

  Rcpp::NumericVector xa(a);

  int n = xa.size();

  Rcpp::NumericVector xr(a);            // still points to a

  for(int i=0; i < n; i++) {

    if(xr[i]<0) xr[i] = 0;

  }

  return xr;

')


p <- seq(-2,2)

print(class(p))

print(cbind(f1(p), p))

print(cbind(f2(p), p))

p <- as.numeric(seq(-2,2))

print(class(p))

print(cbind(f1(p), p))

print(cbind(f2(p), p))

這就是我所看到的:


edd@max:~/svn/rcpp/pkg$ r /tmp/ari.r

Loading required package: methods

[1] "integer"

        p

[1,] 0 -2

[2,] 0 -1

[3,] 0  0

[4,] 1  1

[5,] 2  2

        p

[1,] 0 -2

[2,] 0 -1

[3,] 0  0

[4,] 1  1

[5,] 2  2

[1] "numeric"

       p

[1,] 0 0

[2,] 0 0

[3,] 0 0

[4,] 1 1

[5,] 2 2

       p

[1,] 0 0

[2,] 0 0

[3,] 0 0

[4,] 1 1

[5,] 2 2

edd@max:~/svn/rcpp/pkg$

因此,無(wú)論是從int到float還是從float到float都是非常重要的。


查看完整回答
反對(duì) 回復(fù) 2019-12-05
?
BIG陽(yáng)

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

這很有趣。知道這一點(diǎn)的唯一方法是通過(guò)我猜想的調(diào)試器(或者您像Dirk一樣編寫程序包)。有沒(méi)有辦法將調(diào)試器附加到Rcpp函數(shù)?我正在考慮像Visual Studio調(diào)試器那樣附加dll的方法,然后單擊該dll即可進(jìn)入代碼。

查看完整回答
反對(duì) 回復(fù) 2019-12-05
  • 2 回答
  • 0 關(guān)注
  • 687 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)