2014-11-18 3 views
0
y <- matrix(c(1,2,3,4,5,6,7,8,9),3,3) 
p <- 3 
oldgamma <- as.matrix(rep(1,3)) 
func1 <- function(i, j, y, oldgamma) { 
    return(y[i,j]/(oldgamma[i] + oldgamma[j])) 
} 
func1 <- Vectorize(func1) 
outer(1:p, 1:p, func1, y, oldgamma) 

возвращает сообщение об ошибке: Ошибка в у [I, J]: неправильное число измеренийвнешняя функция R

Может кто-нибудь помочь мне решить эту проблему?

+0

Не могли бы вы показать ожидаемый выход – akrun

ответ

0

Может быть, это помогает

y/(oldgamma[row(y)]+oldgamma[col(y)]) 
#  [,1] [,2] [,3] 
#[1,] 0.5 2.0 3.5 
#[2,] 1.0 2.5 4.0 
#[3,] 1.5 3.0 4.5 

Или

y/with(expand.grid(rep(list(1:p),2)), 
       oldgamma[Var1]+oldgamma[Var2]) 

Или используя код

func1 <- function(i, j, y, oldgamma) { 
    return(y[cbind(i,j)]/(oldgamma[i] + oldgamma[j])) 
} 
outer(1:p, 1:p, func1, y, oldgamma) 
# [,1] [,2] [,3] 
#[1,] 0.5 2.0 3.5 
#[2,] 1.0 2.5 4.0 
#[3,] 1.5 3.0 4.5 
+0

Благодаря @akrun. Ваш ответ действительно помогает. Первый метод, который вы мне даете, потрясающий. Кстати, для моего кода я не уверен, почему использование cbind() может решить проблему. Не могли бы вы немного объяснить? – aaa

+0

@meng 'cbind' предоставит индекс' row', 'column' в качестве матрицы, который будет таким же, как' external (1: p, 1: p, function (i, j) y [matrix (c (i, j), ncol = 2)]). Но, я думаю, вам даже не нужна «внешняя», чтобы решить эту проблему. – akrun

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