R中S3类的重载矩阵乘法

时间:2016-11-13 23:56:12

标签: r class matrix operator-overloading

如何在R中重载矩阵乘法运算符?我已经能够与大多数其他运算符(使用Ops)一起使用,但是使用矩阵运算我得到了这个错误:

requires numeric/complex matrix/vector arguments

以下是最低工作示例:

speed = function(x){
    structure(list(y = x),
              class = "speed")
}

m = matrix(c(1,2,3,4), ncol = 2)
s = speed(m)

# Addition works fine
`+.speed` = function(e1, e2){ e1$y + e2 }

s + 10

# But matrix multiplication doesn't
`%*%.speed` = function(e1, e2){ e1$y %*% e2 }

s %*% c(1,2)

1 个答案:

答案 0 :(得分:2)

我认为这是因为%*%默认情况下不是S3通用函数。你可以通过这样做来解决这个问题。

`%*%.default` = .Primitive("%*%") # assign default as current definition
`%*%` = function(x,...){ #make S3
  UseMethod("%*%",x)
}
`%*%.speed` = function(e1, e2){ e1$y %*% e2 } # define for speed

s %*% c(1,2)
     [,1]
[1,]    7
[2,]   10

如果您想了解有关here

的其他信息,可以查看Hadley的书。

根据以下评论编辑。