rcpp 更新基础环境中的数据
rcpp updating data in base environment
我正在 Rcpp 中研究一个简单的匹配算法,它需要一些人 (I)、一些学校 (J)、一些提交的选择 (nc)、个人的优先级排名 (pos) ), 空缺人数 (emp), 真正的选择..
#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
您的 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
我正在 Rcpp 中研究一个简单的匹配算法,它需要一些人 (I)、一些学校 (J)、一些提交的选择 (nc)、个人的优先级排名 (pos) ), 空缺人数 (emp), 真正的选择..
#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
您的 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