跟踪矩阵中的意外更改

时间:2016-04-13 14:04:40

标签: r matrix

我有一个很大的矩阵(9600x9600,703.6 Mb),不断变化。创建时它看起来很好,但在用于计算之后,除了几列之外的所有值都被0替换。由于我无法调试问题,这让我有点疯狂。有没有办法追踪变量的变化?像更改或访问日志?或者有没有办法锁定变量,以便不能修改它?

非常感谢任何帮助。

编辑:

似乎矩阵" L"在应用此等式后,即使已经锁定了' lockBinding后,也会对其进行修改:

F.calc.E = function(M,p){
  M$V1 <- paste(M$V1,M$V2,sep = ", ")
  p.loc = grep(pattern = p,x = M$V1) # loc of target pressure
  p.vector = as.numeric(M[p.loc,4:ncol(M),with=FALSE])
  pL = mmult(L,p.vector)
  return(pL)
}

mmult函数的代码就是这个,通过另一个SO帖子获得:

func <- 'NumericMatrix mmult( NumericMatrix m , NumericVector v , bool byrow = true ){
if( byrow );
if( ! m.nrow() == v.size() ) stop("Non-conformable arrays") ;
if( ! byrow );
if( ! m.ncol() == v.size() ) stop("Non-conformable arrays") ;

NumericMatrix out(m) ;

if( byrow ){
for (int j = 0; j < m.ncol(); j++) {
for (int i = 0; i < m.nrow(); i++) {
out(i,j) = m(i,j) * v[j];
}
}
}
if( ! byrow ){
for (int i = 0; i < m.nrow(); i++) {
for (int j = 0; j < m.ncol(); j++) {
out(i,j) = m(i,j) * v[i];
}
}
}
return out ;
}'

我仍然无法调试。

1 个答案:

答案 0 :(得分:2)

您可以使用lockBinding

m <- matrix(1:4, 2)
evil.fun <- function(x) .GlobalEnv[[x]][2,2] <- 0
evil.fun("m")
m
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    0

m <- matrix(1:4, 2)
lockBinding("m", .GlobalEnv)
evil.fun("m")
#Error in .GlobalEnv[[x]][2, 2] <- 0 : 
#  cannot change value of locked binding for 'm'

unlockBinding("m", .GlobalEnv)