2016-06-18 2 views
2

行列の行の最大要素を選択する必要がありますが、自分自身を一部の列の間隔に制限する必要があります。私はこれを何度もやり直す必要がありますし、毎回変更を見なければならない「列範囲」も必要です。これまでは、妥当な時間内にシミュレーションを実行できないような拘束力があります。以下は私がやっていることの一例です。私は最適化する必要があるコードは、ここでmapply(function(x,y) apply(A[c(x,x:y,y),],2,max),Min,Max)いくつかの列の間で行の最大要素を高速に選択する方法

A=matrix(runif(100^2),ncol=100) 
Min=sample(80,10000,replace=T) 
Max=Min+sample(1:10,10000,replace=T) 
system.time(mapply(function(x,y) apply(A[c(x,x:y,y),],2,max),Min,Max)) 
user system elapsed 
1.52 0.01 1.54 
+0

よりも約37倍高速であるrowMaxsアプローチ@ MauricoRomero、私は間違っているかもしれませんが、あなたのコードは、あなたの質問に述べたものとは逆です。つまり、列のサブセットを持っているので、行のmax要素を検索するとします。しかし、 'A [c(x、x:y、y)、]'は行を部分集合にしています。また、 'apply(A [c(x、x:y、y)]、2、max)'は列の中のmax要素を探しています。私は何かを誤解していますか? –

答えて

2

あるmatrixStatsライブラリを使用した例です。通知、私はあなたの質問に答えました。あなたが提供するコードはあなたの質問と「一貫性がありません」。あなたの質問の下に私のコメントを参照してください。

library(matrixStats) 


myA <- mapply(function(x,y) rowMaxs(A, cols = x:y), Min, Max) 

より効果的にあなたのコードを時刻に、私は以下の調整をした:

library(matrixStats) 

n = 1e3 

dim = 1e3 

A = matrix(sample(100, dim*dim, replace = T), nrow = dim, ncol = dim) 

Min = sample(dim*.8, n, replace = T) 

Max = Min + sample(1:10, n, replace = T) 


f1 <- function(){ 
    mapply(function(x,y) rowMaxs(A, cols = x:y), Min, Max) 
} 

f2 <- function(){ 
    mapply(function(x,y) apply(A[, c(x:y)], 1, max), Min ,Max) 
} 

とき、私の時間、それはapplyアプローチ

microbenchmark(f1(), f2(), times = 10) 

Unit: milliseconds 
expr  min   lq  mean  median  uq  max neval 
f1() 76.20204 77.89764 98.98646 93.06952 107.3973 159.0868 10 
f2() 2806.49448 3340.67081 3652.18062 3417.00287 3637.7743 5130.4474 10 
+1

こんにちは、編集していただきありがとうございます。コードは正解でしたが、私のテキストは正しくありませんでした。問題は解決された。私はcolMaxを使いました –

関連する問題