2

double のかなり大きな (1040x1392) マトリックスがあり、列が最初のマトリックスの 16x16 パッチである別のマトリックスを抽出したいと考えています。(私は知っています、それは多くのデータであり、それを使用するのは実用的ではないかもしれませんが、これはうまくいくはずです...)

「データ」が元の行列であるこのコードを使用してみました:

# Create a matrix of starting coordinates for each patch
patch.size = 16
patch.inc = patch.size - 1
coords = expand.grid(x=1:(ncol(data)-patch.inc), y=1:(nrow(data)-patch.inc))
coords = as.matrix(coords)

# Pre-allocate the destination matrix
patches = double(nrow(coords)*patch.size^2)
dim(patches) = c(patch.size^2, nrow(coords))

#Create overlapping patches
for (i in 1:nrow(coords))
{
  x=coords[i,1]
  y=coords[i,2]
  patches[,i] = as.vector(data[y:(y+patch.inc), x:(x+patch.inc)])
}

これは、8 GB の RAM を搭載した適度に高速な Win7-64 マシンでは信じられないほど遅く実行されます。100 個のパッチを作成するだけでも時間がかかります。

パッチ[、i]への割り当てが問題であることが判明しました。タスク マネージャーを見ると、パッチに割り当てるとメモリ使用量が急増しています[,i]。

いくつか質問があります。まず、何が起こっているのですか?割り当てごとにパッチ マトリックス全体がコピーされているようです。そうですか?もしそうなら、なぜですか?パッチマトリックスを事前に割り当てることでそれを回避できると思いました。第二に、このコードを書くためのより良い方法はありますか?

ありがとう!ケント

4

1 に答える 1

1

2 番目の質問については、 を使用したソリューションを次に示しlapplyます。

outスクリプトとして正確な出力が必要な場合は、結果を転置できます。より小さい寸法でチェックし、出力と等しいことを確認しましたpatches

set.seed(1234)
nr <- 1040
nc <- 1392
data <- matrix(rnorm(nr*nc), nrow = nr)
patch.size <- 16
idx <- expand.grid(1:(ncol(data)-patch.size+1), 1:(nrow(data)-patch.size+1))
idx[,3] <- idx[,1]+patch.size-1
idx[,4] <- idx[,2]+patch.size-1
idx <- as.matrix(idx)

# using rbenchmark
require(rbenchmark)
myFun <- function() {
    out <- do.call(rbind, lapply(1:nrow(idx), 
        function(tx) c(data[idx[tx,2]:idx[tx,4], idx[tx,1]:idx[tx,3]])))
}
benchmark(myFun(), replications = 2)

# Result:
     test replications elapsed relative user.self sys.self user.child sys.child
1 myFun()            2 152.146        1   147.957    4.184          0         0

# using system.time
system.time(out <- do.call(rbind, lapply(1:nrow(idx), 
        function(tx) c(data[idx[tx,2]:idx[tx,4], idx[tx,1]:idx[tx,3]]))))        

# Result
  user  system elapsed 
58.852   1.784  60.638 
于 2013-01-08T14:57:32.257 に答える