2013-11-18 1 views
4

Учитывая вектор:вектор в матрицу различий между элементами

vec <-1:5 

Что такое эффективный способ создать матрицу, где разница между компонентами вектора отображается в матрице, разностную матрицу, если вы будете , Я мог бы сделать это с двумя циклами, но мне нужно сделать это с гораздо большим набором данных. Вероятно, существует термин для этой матрицы, которую я пытаюсь сделать, но мне не повезло найти ее. Вот как будет выглядеть результат.

m<-matrix(c(NA), ncol=5, nrow=5, byrow=TRUE) 
rownames(m)<-1:5;colnames(m)<-1:5 
for(i in 1:5){for(j in 1:5){m[i,j]<-(as.numeric(rownames(m)[i])-as.numeric(rownames(m)[j]))}} 
m 

Спасибо за любую помощь!

ответ

10

Обычно это делается с outer.

outer(1:5, 1:5, '-') 

См ?outer подробности.

2

Возможное решение:

matrix(vec, 5, 5, byrow=TRUE) - matrix(vec, 5, 5, byrow=FALSE) 

или даже

matrix(vec, 5, 5, byrow=TRUE) - vec 

Пожалуйста, простите зашиты 5, это для простоты.

1

Я бы использовал функцию vapply - это не намного медленнее, чем подход matrix ... и мне не нравится, как outer возвращает результат. См. Ниже:

dd <- 1:5 
vapply(seq_along(dd), 
     FUN = function(i, X) X[[i]] - X, 
     FUN.VALUE = numeric(length(dd)), 
     dd) 

vf <- function() vapply(seq_along(dd), 
         FUN = function(i, X) X[[i]] - X, 
         FUN.VALUE = numeric(length(dd)), 
         dd) 

mf <- function() matrix(dd, length(dd), length(dd), byrow=T) - 
       matrix(dd, length(dd), length(dd), byrow=FALSE) 

microbenchmark(vf(), mf(), times = 1e4) 

Unit: microseconds 
expr min  lq  mean median  uq  max neval cld 
vf() 20.527 22.037 26.678118 22.942 24.149 785.434 1000 b 
mf() 4.227 4.831 6.343785 5.132 5.434 503.499 1000 a 

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

  • Нет связанных вопросов^_^