2014-01-31 6 views
2

Я пытаюсь вычислить матрицу смежности в R для учета сетевой автокорреляции сети в двоичной модели. Я могу построить матрицу Мне нужно, используя внешний(), но это не будет масштабироваться, если я не могу понять, как иметь R дать мне результаты в каком-то редком формате матрицы:редкий наружный продукт в R?

N = 10 
g = simplify(watts.strogatz.game(1, N, 2, 0.05)) 
EL = get.edgelist(g) 
ego_out = outer(EL[,1], EL[,1], '==') 
alter_out = outer(EL[,2], EL[,2], '==') 
ea_out = outer(EL[,1], EL[,2], '==') 
ae_out = outer(EL[,2], EL[,1], '==') 

pair_out = ego_out | alter_out 
opp_out = ea_out | ae_out 

pair_out | opp_out 

Это, очевидно, не масштабируется (если вы смелый, попробуйте установить N = 10000000).

+1

Вы изучали пакеты 'Matrix' и/или' SparseM' - они поддерживают операцию разреженной матрицы. –

+1

@ user102890 Да, я не видел ничего подобного внешнему (..., '==') – Solomon

ответ

0

Что у меня ниже, работает довольно медленно.

outer_Matrix = function(X, Y, FUN = '==', ...){ 
    require('Matrix') 
    dX <- length(X) 
    no.nx <- is.null(names(X)) 
    if (!no.nx) 
    nx <- list(names(X)) 
    dY <- length(Y) 
    no.ny <- is.null(names(Y)) 
    if (!no.ny) 
    ny <- list(names(Y)) 

    # instead iterate over each item in X, check against Y 
    robj <- Matrix(FALSE, nrow = dX, ncol = dY) 
    rows = which(X %in% Y) 

    FUN <- match.fun(FUN) 
    for(i in rows){ 
     robj[i,] <- FUN(X[i], Y, ...) 
     if(i %% 1000==0) 
     print(i) 
    } 

    if (!(no.nx && no.ny)) { 
    if (no.nx) 
     nx <- vector("list", length(dX)) 
    else if (no.ny) 
     ny <- vector("list", length(dY)) 
    dimnames(robj) <- c(nx, ny) 
    } 
    robj 

} 
Смежные вопросы