如何重载矩阵乘法运算符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)
我认为这是因为%*%
默认情况下不是 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
根据下面的评论进行编辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)