2016-06-18 4 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

@ MauricoRomero, я могу быть неверным, но ваш код делает противоположное тому, что вы заявляете в своем вопросе. А именно, вы говорите, что хотите найти элемент max в строке, если у вас есть подмножество столбцов. Однако 'A [c (x, x: y, y),]' является подмножеством по строкам. Также 'apply (A [c (x, x: y, y),], 2, 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) 
} 

Когда я раз rowMaxs подход это около 37 раз быстрее, чем 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

Привет, спасибо за изменения. Код был верным, но мой текст не был. Проблема решена. Я просто использовал colMaxs –

Смежные вопросы