2017-01-29 14 views
0

IはRで大きな正方行列を有する:Rの計算は大きなNORマトリックス

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

この空行列は、すべての行列インデックス対の全て等しいビットの和で充填する必要があります。

だから私は例えば、論理NOR i(rowIndexプロパティ)とj(colIndex)のために計算し、結果を合計する必要があります。

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

Currenty、私は行列を満たし、この機能を持っています

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分より少し速い1つのソリューションがあります。

最初に、概念の証明、寸法の明確さのために正方形以外の正方形。あなたが技術的に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

関連する問題