2015-05-20 50 views
-1

我正在研究Rcpp中的一個簡單的匹配算法,該算法需要多個個體(I),多個學校(J),多個提交選項(nc),優先級排序個人(POS)的,空缺(EMP),而真正的選擇的數量..rcpp更新基本環境中的數據

#include <Rcpp.h> 
using namespace Rcpp; 

//[[Rcpp::export]] 
NumericVector gs2(int I, int J, int nc, NumericVector pos, NumericVector emp, NumericMatrix choices) { 
    NumericVector admits(J); 
    NumericVector out(I); 
    std::fill(out.begin(),out.end(),J+1); 
    for (int i=0;i<I;i++){ 
    NumericVector apply = choices(pos(i),_)-1; 
    for (int j=0;j<nc;j++){ 
    if (emp(apply(j))>0) 
    { 
     out(pos(i)) = apply(j)+1; 
     admits(apply(j)) = admits(apply(j)) + 1; 
     emp(apply(j)) = emp(apply(j)) - 1; 
     break; 
    } 
    } 
    } 
    return out; 
} 

代碼工作很好..除了它看起來與我的數據搞亂..運行代碼後我的尺寸變量已被更改...我錯過了什麼嗎?謝謝

set.seed(123) 
rank  = (1:20)-1 
stuchoice = matrix(sample(1:3,6*20,replace=T),byrow=T,ncol=6,nrow=20) 

size = c(7,11,4) 

gs2(20,3,6,rank,size,stuchoice) 
size 

回答

3

您的size變量正在改變,因爲您正在更改它在您的C++代碼。特別是這一行:

emp(apply(j)) = emp(apply(j)) - 1; 

Rcpp參照,所以,只要你對他們做內將反映在您的頂級R參數變量傳遞。如果你想避免這種情況,那麼你想clone你的變量。將代碼更改爲以下內容可以解決問題。

#include <Rcpp.h> 
using namespace Rcpp; 

// Note the change in the name of 'emp' to 'emp_'!!! 

//[[Rcpp::export]] 
NumericVector gs2(int I, int J, int nc, NumericVector pos, NumericVector emp_, NumericMatrix choices) { 
    NumericVector admits(J); 
    NumericVector out(I); 

    // clone your emp 
    NumericVector emp = clone(emp_); 

    std::fill(out.begin(),out.end(),J+1); 
    for (int i=0;i<I;i++){ 
    NumericVector apply = choices(pos(i),_)-1; 
    for (int j=0;j<nc;j++){ 
    if (emp(apply(j))>0) 
    { 
     out(pos(i)) = apply(j)+1; 
     admits(apply(j)) = admits(apply(j)) + 1; 
     emp(apply(j)) = emp(apply(j)) - 1; 
     break; 
    } 
    } 
    } 
    return out; 
} 

測試

library(Rcpp) 
sourceCpp("test.cpp") 

set.seed(123) 
rank  = (1:20)-1 
stuchoice = matrix(sample(1:3,6*20,replace=T),byrow=T,ncol=6,nrow=20) 

size = c(7,11,4) 

gs2(20,3,6,rank,size,stuchoice) 
size 
[1] 7 11 4 
+0

謝謝!但是當我創建另一個變量像var1 = size ..它也改變了var1。這怎麼可能? – msdu

+0

因爲通過設置'var = size',他們在技術上指向相同的東西。如果分別更改'size',例如'size =「foo」',那麼您實質上是重新聲明'size',而var'仍然指向內存中的原始對象。 – cdeterman

+0

好的。謝謝.. – msdu