[R] How to build a large identity matrix faster?

Spencer Graves spencer.graves at structuremonitoring.com
Sat Jun 9 00:11:00 CEST 2012


       How can one get the source code for diag?  I tried the following:


 > diag
standardGeneric for "diag" defined from package "base"

function (x = 1, nrow, ncol)
standardGeneric("diag")
<environment: 0x0000000009dc1ab0>
Methods may be defined for arguments: x, nrow, ncol
Use  showMethods("diag")  for currently available ones.


       How can I look at the code past the methods dispatch?


 > methods('diag')
[1] diag.panel.splom
Warning message:
In methods("diag") : function 'diag' appears not to be generic


       So "diag" is an S4 generic.  I tried the following:


 > dumpMethods('diag', file='diag.R')
 > readLines('diag.R')
character(0)


       More generally, what do you recommend I read to learn about S4 
generics?  I've read fair portions of Chambers (1998, 2008), which 
produced more frustration than enlightenment for me.


       Thanks,
       Spencer


On 6/8/2012 12:07 PM, Uwe Ligges wrote:
> I quickly looked at it, and the difference comes from:
>
> n <- 5e3
> system.time(x <- array(0, c(n, n))) # from diag()
> system.time(x <- matrix(0, n, n))   # from Rdiag()
>
> Replaced in R-devel.
>
> Best,
> Uwe Ligges
>
>
>
> On 07.06.2012 12:11, Spencer Graves wrote:
>> On 6/7/2012 2:27 AM, Rui Barradas wrote:
>>> Hello,
>>>
>>> To my great surprise, on my system, Windows 7, R 15.0, 32 bits, an R
>>> version is faster!
>>
>> I was also surprised, Windows 7, R 2.15.0, 64-bit
>>
>>
>> > rbind(diag=t1, Rdiag=t2, ratio=t1/t2)
>> user.self sys.self elapsed user.child sys.child
>> diag 0.72 0.080000 0.81 NA NA
>> Rdiag 0.09 0.030000 0.12 NA NA
>> ratio 8.00 2.666667 6.75 NA NA
>> >
>> > sessionInfo()
>> R version 2.15.0 (2012-03-30)
>> Platform: x86_64-pc-mingw32/x64 (64-bit)
>>
>> locale:
>> [1] LC_COLLATE=English_United States.1252
>> [2] LC_CTYPE=English_United States.1252
>> [3] LC_MONETARY=English_United States.1252
>> [4] LC_NUMERIC=C
>> [5] LC_TIME=English_United States.1252
>>
>> attached base packages:
>> [1] splines stats graphics grDevices utils datasets methods
>> [8] base
>>
>> other attached packages:
>> [1] fda_2.2.9 Matrix_1.0-6 lattice_0.20-6 zoo_1.7-7
>>
>> loaded via a namespace (and not attached):
>> [1] grid_2.15.0 tools_2.15.0
>> >
>>
>>
>> Spencer
>>>
>>>
>>> Rdiag <- function(n){
>>> m <- matrix(0, nrow=n, ncol=n)
>>> m[matrix(rep(seq_len(n), 2), ncol=2)] <- 1
>>> m
>>> }
>>>
>>> Rdiag(4)
>>>
>>> n <- 5e3
>>> t1 <- system.time(d1 <- diag(n))
>>> t2 <- system.time(d2 <- Rdiag(n))
>>> all.equal(d1, d2)
>>> rbind(diag=t1, Rdiag=t2, ratio=t1/t2)
>>>
>>>
>>> Anyway, why don't you create it once, save a copy and use it many 
>>> times?
>>>
>>> Hope this helps,
>>>
>>> Rui Barradas
>>>
>>> Em 07-06-2012 08:55, Ceci Tam escreveu:
>>>> Hello, I am trying to build a large size identity matrix using
>>>> diag(). The
>>>> size is around 23000 and I've tried diag(23000), that took a long 
>>>> time.
>>>> Since I have to use this operation several times in my program, the
>>>> running
>>>> time is too long to be tolerable. Are there any alternative for 
>>>> diag(N)?
>>>> Thanks
>>>>
>>>> Cheers,
>>>> yct
>>>>
>>>> [[alternative HTML version deleted]]
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list