Быстрая индексация матриц из векторов

Я хочу сделать много матричных индексов массива с высоким D, но индексы разделены. Я придумал несколько решений:

### setup
test <- array(0, c(3,3,3,3))
test[1,2,3,2] <- 1
system.time(for (i in 1:1000000) test[1,2,3,2] )
### index split between two vectors
idx1 <- c(1,2);     idx2 <- c(3,2)
### things that work are slower
system.time(for (i in 1:1000000) test[rbind(c(idx1, idx2))] )
system.time(for (i in 1:1000000) test[matrix(c(idx1, idx2), nrow=1)] )
system.time(for (i in 1:1000000) test[t(c(idx1, idx2))] )

Но самый быстрый, rbind(c(X)), занимает в два раза больше времени, чем непосредственное индексирование. Есть ли более быстрый способ? Есть ли что-нибудь вроде python *args, которое я мог бы запустить на '['?


person enfascination    schedule 06.11.2013    source источник
comment
Как разделены ваши индексные векторы? Можете ли вы предоставить образец с более чем одним индексом. Эта операция должна быть полностью векторизована. Медлительность, которую вы видите, связана с тем, что вы используете цикл for для выполнения чего-то, для чего вы не должны использовать цикл for.   -  person Simon O'Hanlon    schedule 06.11.2013
comment
Надеюсь, вы правы в том, что мне не нужен цикл for, но я не уверен. Можете ли вы векторизовать это? ### заполнение распределения testa наблюдениями testi testi ‹- matrix(sample(c(1,2,3), 400000, repl=T), ncol=4) testa1 ‹- array(0, c(3,3,3) ,3)) testa2 ‹- массив(0, c(3,3,3,3)) for (i in 1:nrow(testi)) { testa1[rbind(testi[i,])] ‹- testa1[rbind (testi[i,])] + 1 } ### для решения цикла testa2[testi] ‹- testa2[testi] + 1 ### векторизованное решение? Это быстрее, но сломано. Что бы ты сделал? все(testa1 == testa2) сумма(testa1); сумма(теста2)   -  person enfascination    schedule 06.11.2013


Ответы (1)


Немного громоздко, но попробуйте

test[idx1[1], idx1[2], idx2[1], idx2[2]]
person Hong Ooi    schedule 06.11.2013