2017-01-29 5 views
0

I는 R 큰 정방 행렬을 가지고R 계산이 큰 NOR 매트릭스

norMat <- matrix(NA, nrow=1024, ncol=1024) 

이 빈 행렬은 모든 행렬 인덱스 쌍 모두 동일 비트의 합계로 채워질 필요가있다.

그래서 논리 NOR i (rowIndex에) 및 j (colIndex) 미국을 계산하고 그 결과를 합산해야 예 :

:

sum(intToBits(2)==intToBits(3)) 

Currenty, I는 행렬을 채운다이 기능을 갖는다

norsum <- function(bucket1, bucket2) 
{ 
    res = sum(intToBits(bucket1)==intToBits(bucket2)) 

    return(res) 
} 
:
norMatrix <- function() 
{ 
    matDim=1024 
    norMat <<- matrix(NA, nrow=matDim, ncol=matDim) 
    for(i in 0:(matDim-1)) { 
    for(j in 0:(matDim-1)) { 
     norMat[i+1,j+1] = norsum(i,j) 
    } 
    } 

    return(norMat) 
} 

그리고 여기가 norsum 기능입니다3210

매트릭스를 채우기위한 효율적인 솔루션입니까? 내 컴퓨터에서 5 분 이상 걸리기 때문에 의심 스럽습니다.

답변

1

이 기능은 *apply 기능을위한 좋은 기회라고 제안합니다. 여기 5 분보다 약간 빠른 해결책이 있습니다.

개념의 증명, 차원의 명확성을 위해 비 - 사각형 전용. 당신은 기술적으로 mtximtxj를 미리 계산 할 필요가 없습니다

n <- 1024 
mtx <- sapply(seq_len(n), intToBits) 
system.time(
    ret <- sapply(1:n, function(i) sapply(1:n, function(j) sum(mtx[,i] == mtx[,j]))) 
) 
# user system elapsed 
# 3.25 0.00 3.36 

:

nc <- 5 
nr <- 6 
mtxi <- sapply(seq_len(nc), intToBits) 
mtxj <- sapply(seq_len(nr), intToBits) 
sapply(1:nc, function(i) sapply(1:nr, function(j) sum(mtxi[,i] == mtxj[,j]))) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 32 30 31 30 31 
# [2,] 30 32 31 30 29 
# [3,] 31 31 32 29 30 
# [4,] 30 30 29 32 31 
# [5,] 31 29 30 31 32 
# [6,] 29 31 30 31 30 

이이 올바른지, 전체 식사 거래를 가정. intToBits은 오버 헤드가 많지 않지만 매번 다시 계산하는 것은 어리석은 생각입니다.

내 시스템이 적당합니다 (i7 6600U CPU @ 2.60GHz), win10_64, R-3.3.2 ... 너무 화려하지는 않습니다.

+0

Thx, 정말 큰 속도입니다! – juxeii