for循环中的矩阵乘法
Matrix multiplication in a for loop
当下面的代码在R中是运行时,会弹出错误信息:
“Xt[i, ] <- F * Xt[i - 1, ] + V 中的错误:
要替换的项目数不是替换长度的倍数
感谢您的帮助。
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
}
看看尺寸:
你定义
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
对象。所以,在你的循环中你试图分配一个对象
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,]
是逐元素乘法,而不是经典的矩阵向量乘法。如果您想用 mxn
-矩阵 A
和 nx1
-向量 b
执行 A*b
乘法,您必须改用 %*%
。在这种情况下,V
的维度必须是 mx1
.
当下面的代码在R中是运行时,会弹出错误信息:
“Xt[i, ] <- F * Xt[i - 1, ] + V 中的错误: 要替换的项目数不是替换长度的倍数
感谢您的帮助。
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
}
看看尺寸: 你定义
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
对象。所以,在你的循环中你试图分配一个对象
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,]
是逐元素乘法,而不是经典的矩阵向量乘法。如果您想用 mxn
-矩阵 A
和 nx1
-向量 b
执行 A*b
乘法,您必须改用 %*%
。在这种情况下,V
的维度必须是 mx1
.