Как создать список имен переменных (i, j), а затем присвоить им значения, особенно для двойного индекса (используя R) - PullRequest
0 голосов
/ 18 сентября 2018

Интересно, есть ли простой способ создать список переменных, используя цикл for, и дать его значение.

Здесь я пытаюсь сгенерировать A11, A12, A13, A14, A21, A22,A23, A24, A31, A32, A33, A34, A41, A42, A43, A44 и назначить матрицу 6 на 6.После этого я хочу сделать некоторые вычисления.

Ниже приведена часть кода.Как это упростить. (Используя R)

for (i in 1:4){ assign(paste("A",i, sep=""), matrix(0,6,6)) }

for (i in 1:4){ assign(paste("A1",i, sep=""), matrix(0,6,6)) };A11;A12;A13;A14

for (i in 1:4){ assign(paste("A2",i, sep=""), matrix(0,6,6)) };A21;A22;A23;A24

for (i in 1:4){ assign(paste("A3",i, sep=""), matrix(0,6,6)) };A31;A32;A33;A34

for (i in 1:4){ assign(paste("A4",i, sep=""), matrix(0,6,6)) };A41;A42;A43;A44



for (i in 1:nrow(X)){
p<-YHatMulti(theta,X[i,])


A11<-(A11-as.numeric(p[,1]*(1-p[,1]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))

A22<-(A22-as.numeric(p[,2]*(1-p[,2]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))

A33<-(A33-as.numeric(p[,3]*(1-p[,3]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))

A44<-(A44-as.numeric(p[,4]*(1-p[,4]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))



A12<-A12+as.numeric(p[,1]*p[,2])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A13<-A13+as.numeric(p[,1]*p[,3])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))
A14<-A14+as.numeric(p[,1]*p[,4])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A21<-A21+as.numeric(p[,2]*p[,1])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A23<-A23+as.numeric(p[,2]*p[,3])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A24<-A24+as.numeric(p[,2]*p[,4])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A31<-A31+as.numeric(p[,3]*p[,1])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A32<-A32+as.numeric(p[,3]*p[,2])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A34<-A34+as.numeric(p[,3]*p[,4])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A41<-A41+as.numeric(p[,4]*p[,1])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A42<-A42+as.numeric(p[,4]*p[,2])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))

A43<-A43+as.numeric(p[,4]*p[,3])*(as.matrix(X[i,]))%*%t(as.matrix(X[i,]))




A1<-rbind(A11,A12,A13,A14)

A2<-rbind(A21,A22,A23,A24)

A3<-rbind(A31,A32,A33,A34)

A4<-rbind(A41,A42,A43,A44)

A<-cbind(A1,A2,A3,A4)

}

A

1 Ответ

0 голосов
/ 18 сентября 2018

Один из способов упростить этот код - перестать использовать переменные с именем A1, A2 и т. Д.

Вместо этого вы можете создать список списков:

A <- list()

# Initalize sub-lists
for (i in 1:4) {
    A[[i]] <- list()
}

Илинесколько более компактно,

A <- replicate(4, list())

Тогда вместо присвоения A11 вы можете назначить A[[1]][[1]]:

A[[1]][[1]] <- matrix(0,6,6))

Но вы можете добиться большего!Посмотрите, что здесь происходит:

A <- matrix(list(), 4, 4)

На самом деле это матрица , но это также список и может содержать другие матрицы:

A[[1,1]] <- matrix(0,6,6))

Итак, мыможно упростить этот код

for (i in 1:nrow(X)) {
  A11<-(A11-as.numeric(p[,1]*(1-p[,1]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))
  A22<-(A22-as.numeric(p[,2]*(1-p[,2]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))
  A33<-(A33-as.numeric(p[,3]*(1-p[,3]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))
  A44<-(A44-as.numeric(p[,4]*(1-p[,4]))*(as.matrix(X[i,]))%*%t(as.matrix(X[i,])))
}

до этого

for (i in 1:nrow(X)) {
  xi <- as.matrix(X[i,])
  xi_norm <- xi %*% t(xi)
  for (k in 1:4) {
    A[[k, k]] <-(A[[k, k]] - as.numeric(p[,k]*(1-p[,k])) * xi_norm
  }
}

В конце мы можем построить окончательную матрицу A следующим образом:

bind_A_row <- function(row_index) {
  do.call(rbind, A[row_index, ])
}

A_rows <- lapply(1:4, bind_A_row)
A <- do.call(cbind, A_rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...