【问题标题】:Rcpp matrix binarizationRcpp矩阵二值化
【发布时间】:2017-07-16 11:58:05
【问题描述】:

我在Rcpp上做了一个二值化函数:

NumericMatrix binarize_matrix(NumericMatrix m){
int ncol=m.ncol();
for(int i=0; i<ncol; i++){ 
for(int j=0;j<ncol;j++){ 
  if(m(j,i)>1) 
    m(j,i)=1; 
}
}
return m;
}

该功能运行良好。 但是,在 R 中,当我通过 M=m 创建两个矩阵(M 和 m)时。当我对一个进行二值化时,另一个也被二值化。

为什么对象是依赖的?我该如何解决这个问题?

【问题讨论】:

  • 为什么要使用 Rcpp? m[]

标签: r matrix rcpp


【解决方案1】:

您正在制作对象的浅表副本。试试下面的代码,看看控制台输出。

M = data.frame(a=c(1,2))
m = M
tracemem(m)
tracemem(M)

m2 <- data.frame(M)
tracemem(m2)

输出如下:

> M = data.frame(a=c(1,2))
> m = M
> tracemem(m)
[1] "<0x6b9d028>"
> tracemem(M)
[1] "<0x6b9d028>"
> 
> m2 <- data.frame(M)
> tracemem(m2)
[1] "<0x6b9aea8>"

m2 对象在内存中的位置不同。希望这可以帮助!

【讨论】:

  • 正确! Rcpp 通过代理对象使用浅拷贝。如果您希望 m 保持不变,请使用 Rcpp::NumericMatrix m2 = Rcpp::clone(m); 并分配给 m2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多