Указание i-го индекса массива, оставляя другие индексы пустыми - PullRequest
0 голосов
/ 19 июня 2019

Я в основном пытаюсь указать один индекс (или два) n-мерного массива за раз (оставляя все остальные индексы пустыми), где и позиция указанного индекса / индексов, и размерность массива параметры в моем коде (т.е. мне нужно, чтобы это работало для любого n-мерного массива, где n> 1).

У меня есть массив (H) размеров 2x2x ... x2 (n измерений, каждый с диапазоном индекса от 1 до 2). n не указано, просто ограничено n> 1. У меня есть другой массив (J) измерений nx2x2x ... x2 (n + 1 всего измерения, где первое измерение имеет диапазон индекса от 1 до n, а остальные имеют диапазоны индекса от 1 до 2).
Я пытаюсь использовать цикл for для определения следующих подмножеств массива (при условии, что здесь n = 4):

J[1,1,,,]<-H[1,,,]
J[1,2,,,]<-H[1,,,]
J[2,,1,,]<-H[,1,,]
J[2,,2,,]<-H[,1,,]
J[3,,,1,]<-H[,,1,]
J[3,,,2,]<-H[,,1,]
J[4,,,,1]<-H[,,,1]
J[4,,,,2]<-H[,,,1]

Я делал это, просматривая циклы от i = 1 до i = n и пытаясь определить соответствующие подмножества J для каждого значения i. Однако, чтобы это работало, мне нужен способ указать произвольное количество «пустых» индексов. Для фиксированных n и фиксированных i это просто - вы можете просто оставить индексы пустыми, как показано выше, или заменить ИСТИНА:

J[1,1,TRUE,TRUE,TRUE] 
#is equivalent to 
J[1,1,,,]

Чтобы сделать это для массива размерности n Сначала я попытался создать индексную матрицу из одной строки, состоящую из чисел и значений TRUE, но, конечно, R приводит все значения к числовым. Фрейм данных списка или одной строки допускает числовые и логические записи, но не может использоваться для индексации массива. Это проблема, с которой я сталкиваюсь с примером кода, включенным ниже.

J<-array(NA,dim=c(n,rep(2,n)))
for(i in 1:n){
  index_j<-matrix(rep(T,n+1),nrow=1)
  index_j<-data.frame(index_j)
  index_j[c(1,i+1)]<-c(i,1)
  index_h<-index_j[2:(n+1)]
  J[index_j]<-H[index_h]
  index_j[i+1]<-2
  J[index_j]<-H[index_h]
}

1 Ответ

0 голосов
/ 19 июня 2019

Хорошо, я ответил на свой собственный вопрос, но вместо того, чтобы удалить его, я полагаю, что опубликую ответ, если кто-нибудь посчитает его полезным в будущем.

В решении используется функция extract.array (пакет R.utils ) для подстановки массивов и функция abind (пакет abind ) объединять массивы.

Вот аннотированный код:

Jlist<-vector("list",n)
    for(i in 1:n){
      index<-vector("list",n) #indices for each dimension of the array
      for(j in 1:n){
        if(j==i){index[[j]]<-1}else{index[[j]]<-1:2}
      } 
#all dimensions of the array H have index range 1:2
      J_i<-extract.array(H,indices=index,drop=F) 
#extracting the subset of H with the specified indices
      Jlist[[i]]<-abind(J_i,J_i,along=i) 
#combine two copies of J_i, which has index range = 1 in dimension i, along dimension i --> result has index range 1:2 in all dimensions, just like H
    }
    J<-abind(Jlist,along=0) 
#Jlist has n entries, each an n-dimensional array with index range 1:2 in all dimensions. Use abind to combine these in a new dimension (along = 0) producing an array with n+1 dimensions where the first dimension has index range 1:n. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...