Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
超载+;rs4类中的算子与矩阵包_R_Operator Overloading_Sparse Matrix_S4 - Fatal编程技术网

超载+;rs4类中的算子与矩阵包

超载+;rs4类中的算子与矩阵包,r,operator-overloading,sparse-matrix,s4,R,Operator Overloading,Sparse Matrix,S4,当我试图重载+操作符并使用矩阵包和稀疏矩阵时,我得到了一种奇怪的效果。我首先定义一个非常简单的类,它不使用Matrix包,但有一个+操作符。然后我求两个稀疏矩阵的和。第一个M+M加法传递预期结果,但第二个加法抛出错误。下面是生成错误的非常简单的代码: require(Matrix) setClass("TestM",representation(M='numeric')) setMethod("initialize", "TestM", function(.Object,x) { .Obj

当我试图重载
+
操作符并使用
矩阵
包和稀疏矩阵时,我得到了一种奇怪的效果。我首先定义一个非常简单的类,它不使用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的
+
之间是否存在干扰?我是否正确定义了
+
运算符


谢谢大家!

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

大约3,5年后,我偶然发现了同样的错误,这也是最近一个问题的主题:。我已经向R-devel发送了一个错误报告,但后来发现,只有在包外进行重载时,错误才会重现。换句话说,如果您在包中为类
testM
的对象定义
+
方法,并通过加载包来加载重载的
+
-函数,它将解决初始问题,而不必以通用方式重载整个组(这并不总是可能).

我看不出这不是一个S4错误-我建议将它发送到R-devel,John Chambers会在那里看到它。@hadley,你说得对。这是过度超载,需要更具体。我会解决的。@DWin供您参考,我认为它就像
.Generic一样简单(e1@M, e2@M)