矩阵乘法的R误差:不一致的参数

时间:2015-03-31 21:07:05

标签: r loops

我有一个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

1 个答案:

答案 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));