尝试重载+
运算符并使用稀疏矩阵的Matrix
包时,我得到了一个奇怪的效果。我首先定义一个非常简单的类,它不使用Matrix包,但有一个+
运算符。然后我将两个稀疏矩阵求和。第一个M+M
添加会提供预期结果,但第二个会引发错误。这是一个生成错误的非常简单的代码:
require(Matrix)
setClass("TestM",representation(M='numeric'))
setMethod("initialize", "TestM", function(.Object,x) {
.Object@M = x
.Object
})
setMethod("+", c("TestM","TestM"), function(e1,e2) {
e1@M + e2@M
})
M = Matrix(diag(1:10),sparse=T)
M+M # > FINE
M+M # > ERROR
M = Matrix(diag(1:10),sparse=F)
M+M # > FINE
M+M # > FINE
第二次添加会引发以下错误:
Error in forceSymmetric(callGeneric(as(e1, "dgCMatrix"), as(e2, "dgCMatrix"))) :
error in evaluating the argument 'x' in selecting a method for function
'forceSymmetric': Error in .Arith.Csparse(e1, e2, .Generic, class. = "dgCMatrix") :
object '.Generic' not found
如果矩阵不稀疏,则不会发生错误。对于sparseMatrix,+
我定义和+
之间是否存在干扰?我没有正确定义+
运算符吗?
谢谢!
答案 0 :(得分:3)
尝试将Ops类设置为重载:
> setMethod(Ops, c("TestM","TestM"), function(e1,e2) {
+ e1@M + e2@M
+ })
[1] "Ops"
attr(,"package")
[1] "base"
>
> M = Matrix(diag(1:10),sparse=T)
> M+M # > FINE
10 x 10 sparse Matrix of class "dsCMatrix"
[1,] 2 . . . . . . . . .
[2,] . 4 . . . . . . . .
[3,] . . 6 . . . . . . .
[4,] . . . 8 . . . . . .
[5,] . . . . 10 . . . . .
[6,] . . . . . 12 . . . .
[7,] . . . . . . 14 . . .
[8,] . . . . . . . 16 . .
[9,] . . . . . . . . 18 .
[10,] . . . . . . . . . 20
> M+M # (NOT error)... was ERROR
10 x 10 sparse Matrix of class "dsCMatrix"
[1,] 2 . . . . . . . . .
[2,] . 4 . . . . . . . .
[3,] . . 6 . . . . . . .
[4,] . . . 8 . . . . . .
[5,] . . . . 10 . . . . .
[6,] . . . . . 12 . . . .
[7,] . . . . . . 14 . . .
[8,] . . . . . . . 16 . .
[9,] . . . . . . . . 18 .
[10,] . . . . . . . . . 20
答案 1 :(得分:0)
差不多3,5年后,我偶然发现了同样的错误,这也是最近一个问题的主题:setMethod and package Matrix。我已经向R-devel发送了一个错误报告,但事后发现,如果在包外部进行重载,则错误只能重现。换句话说,如果为包中的类+
的对象定义testM
方法并通过加载包加载重载的+
- 函数,它将解决初始问题而不必以一般方式重载整个组(这并非总是可行)。