Умножение матриц в цикле for - PullRequest
1 голос
/ 09 мая 2020

Когда следующий код запускается в R, появляется сообщение об ошибке:

«Ошибка в Xt [i,] <- F * Xt [i - 1,] + V: количество элементов для длина замены не кратна длине замены "</p>

Благодарю за вашу помощь.

X=matrix(rnorm(6),100,6)
n = nrow(X)

F =  diag(1,6,6); F[1,4] = F[2,5] = F[3,6] = 1

#create process & measurement noises (standard deviation)
W = diag(rnorm(1,0,0.01),6,6) 
V = diag(rnorm(1,0,0.02),6,6) 

#create and init Xt and Yt matrices
Xt = matrix(NA, nrow=n+1, ncol=6)
Yt = matrix(NA, nrow=n, ncol=6)
Xt[1,] = X[1,]

#test: 
F * Xt[1,] + V #this is fine!!!

#before entering the loop:
for (i in 2:3)
{
  Xt[i,] = F * Xt[i-1,] + V #BUT this is not!!!
  Yt[i,] = Xt[i,] + W
}

1 Ответ

1 голос
/ 09 мая 2020

Посмотрите на размеры: вы определяете

Xt[1,] = X[1,]

, что дает вам 6x1-matrix. Следующим шагом будет вычисление

F * Xt[1,] + V 

Поскольку F и V имеют размер 6x6, получается новый 6x6-matrix. Проверьте с помощью

dim(as.matrix(X[t,1]))
dim(F)
dim(V)

Теперь Xt сам тусклый 101x6, поэтому Xt[n,], что немного неинтуитивно, дает транспонированный объект 6x1. Итак, внутри вашего l oop вы пытались назначить объект

F * Xt[i-1,] + V
dim(F * Xt[i-1,] + V)   # this gives 6x6

на

Xt[i,]
dim(as.matrix(Xt[i,]))  # this gives 6x1

Таким образом, ваши размеры не подходят. Я надеюсь, что это ответит на ваш вопрос.

У меня есть одна аннотация:

F * Xt[1,] + V 

Умножение F*Xt[1,] - это поэлементное умножение, а не классическое умножение матрицы на вектор. Если вы хотите выполнить умножение A*b на mxn -матрицу A и nx1 -вектор b, вы должны вместо этого использовать %*%. В этом случае V должен иметь размер mx1.

...