2017-01-29 188 views
0

我中的R大的正方形矩陣:- [R計算大NOR矩陣

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

這個空矩陣需要填充了所有矩陣索引對所有等於比特的總和。

所以我需要計算的邏輯NOR爲i(rowIndex位置)和j(colIndex)和求和的結果,例如:

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

Currenty,我有這個功能,其填埋所述矩陣:

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功能:

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

    return(res) 
} 

這是填充矩陣的有效解決方案嗎? 因爲在我的機器上,這個過程需要5分鐘以上,所以我很懷疑。

回答

1

我認爲這是*apply函數的絕好機會。這是一個比5分鐘快一點的解決方案。

首先,概念驗證,非方形僅用於維度的清晰度。

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 

假設這些都是正確的,完整的魚粉成交:

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 

在技術上不需要預先計算mtximtxj。雖然intToBits沒有引入太多開銷,但我認爲每次重新計算都很愚蠢。

我的系統是合理的(i7 6600U CPU @ 2.60GHz),win10_64,R-3.3.2 ...沒什麼太花哨。

+0

Thx,真是巨大的加速! – juxeii