我有一个R循环,一直给我错误。以下是矩阵的维数..
> dim(A)
[1] 2 2
> dim(backward)
[1] 6848 2
我正在尝试运行此循环并收到以下错误:
for (i in t:1){
backward[i,]=A%*%t(backward[i,])}
Error in A %*% t(backward[i, ]) : non-conformable arguments
t等于6848.感谢您的时间。
用bgoldst代码编辑:
> A
[,1] [,2]
[1,] 0.8 0.2
[2,] 0.2 0.8
> backward <- matrix(1:(t*2),t,2);
> dim(backward)
[1] 6848 2
> for (i in t:1) backward[i,] <- A%*%t(backward[i,,drop=F]);
Error in A %*% t(backward[i, , drop = F]) : non-conformable arguments
答案 0 :(得分:4)
我猜你的期望
backward[i,]
是它将返回1x2矩阵,您可以将其用作矩阵乘法的操作数。这是不正确的。在R中,当您在矩阵的维度内指定单个索引时,默认情况下,R将“删除”该维度。在上面这段代码的情况下,行维度被删除,最后得到一个向量,其内容取自索引行的所有列。向量不是矩阵乘法的有效操作数。
您可以通过为drop
操作提供[
参数来解决此问题:
A <- matrix(1:(2*2),2,2);
backward <- matrix(1:(6848*2),6848,2);
t <- nrow(backward); for (i in t:1) backward[i,] <- A%*%t(backward[i,,drop=F]); ## no error
以下是drop=F
:
backward[1,]
## [1] 20548 27398
backward[1,,drop=F]
## [,1] [,2]
## [1,] 20548 27398
有关详细信息,请参阅?`[`
。
这是一个不依赖于drop=F
参数的解决方案:
for (i in t:1) backward[i,] <- A%*%t(matrix(backward[i,],1));