【问题标题】:Overloading + operator in R S4 classes and Matrix packageR S4 类和 Matrix 包中的重载 + 运算符
【发布时间】:2016-06-01 19:01:13
【问题描述】:

在尝试重载 + 运算符并使用带有稀疏矩阵的 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 的 + 之间是否存在一些干扰?我没有正确定义+ 运算符吗?

谢谢!

【问题讨论】:

  • 我看不出这不是 S4 错误 - 我建议将其发送到 John Chambers 会看到的 R-devel。

标签: r operator-overloading sparse-matrix s4


【解决方案1】:

尝试将 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

【讨论】:

  • @hadley,你是对的。它过度超载,需要更加特别。我会解决的。
  • @DWin fyi 我认为就像.Generic(e1@M, e2@M) 一样简单
【解决方案2】:

差不多 3.5 年后,我偶然发现了同样的错误,这也是最近一个问题的主题:setMethod and package Matrix。我已经向 R-devel 发送了一个错误报告,但后来发现,只有在包之外进行重载时,该错误才可重现。换句话说,如果你在一个包内为类testM的对象定义+方法,并通过加载包来加载重载的+-函数,它会解决最初的问题,而不必重载整个组一种通用的方式(这并不总是可能的)。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多