Применение / зацикливание пользовательской функции на основе нескольких списков / матриц в R - PullRequest
0 голосов
/ 12 июня 2018

У меня есть четыре больших списка, которые я преобразовал в матрицы с помощью этой функции:

array(as.matrix(unlist(mat2)), dim=c(3, 80, 100))

Я перечислил список, чтобы преобразовать его в матричную форму (не уверен, если это необходимо, но object.sizeзначительно меньше в качестве матрицы).Если легче работать со списками, пожалуйста, высказывайтесь.Матрицы / списки имеют 132 элемента, но давайте просто примем 100 здесь для простоты.

mat1

num [1:80, 1:100] 0.00669 0.00603 0.00895 0.00771 0.01533 ...

mat2

 num [1:80, 1:80, 1:100] 0.0033 -0.00474 -0.00261 0.00587 -0.00599 ...

mat3

num [1:3, 1:80, 1:100] 0.0159 -0.0131 -0.0131 -0.0656 0.0554 ...

mat4

 num [1:10, 1:3] 0.00545 0.01043 0.00563 0.00431 0.00464 ...

Вот моя функция:

customfunction <- function
(
  mat1,         # num [1:80, 1:100]
  mat2,         # num [1:80, 1:80, 1:100]
  mat3=NULL,    # num [1:3, 1:80, 1:100]
  mat4=NULL,    # num [1:10, 1:3]
  a=0.025       # scalar
)
   {
  omega = diag(c(1,diag(a * mat3 %*% mat2 %*% t(mat3))))[-1,-1]

  temp = solve(t(mat3) %*% solve(omega) %*% mat3 + solve(a * mat2))

  out = temp %*% (solve(a * mat2) %*% mat1 + t(mat3) %*% solve(omega) %*% mat4)

  return(out)
}

Вместо запуска:

customfunction(mat1[1,], mat2[,,1], mat3[,,1], mat4[1,])
customfunction(mat1[2,], mat2[,,2], mat3[,,2], mat4[1,])
customfunction(mat1[3,], mat2[,,3], mat3[,,3], mat4[1,])
...
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
etc...

или

customfunction(mat1[1,], mat2[[1]], mat3[[1]], mat4[1,])
customfunction(mat1[2,], mat2[[2]], mat3[[2]], mat4[1,])
customfunction(mat1[3,], mat2[[3]], mat3[[3]], mat4[1,])
...
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])

Обратите внимание, что mat4[i,] изменяется на 60-й итерацииТо есть я применяю его 60 раз, держа mat4[1,] константу, а затем применяю следующие 60-е итерации с mat[2,].Возможно ли применить (или зациклить) его так, что он будет запускать функцию 100 раз для каждого элемента / строки, чтобы создать матрицу 100x80?Если да, то как?

Большое спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Это задание для sapply():

sapply(1:100, function(i) customfunction(mat1[i,], mat2[,,i], mat3[,,i], mat4[1+ (i-1)%/%60,]))

или

sapply(1:100, function(i) customfunction(mat1[i,], mat2[[i]], mat3[[i]], mat4[1+ (i-1)%/%60,]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...