[R] sparse vectors

Robin Hankin rksh1 at cam.ac.uk
Tue Sep 8 15:58:49 CEST 2009


Hi guys

thanks for this, it works fine, but I'm not sure the Matrix package does 
what I want:

 > a = sparseMatrix(i=c(20, 30, 1000000000), j=rep(1, 3), x=c(2.2, 3.3, 
4.4))
Error in asMethod(object) :
  Cholmod error 'out of memory' at file:../Core/cholmod_memory.c, line 148

Surely an efficient storage mechanism would need only six pieces of 
information?

I've been pondering the solution that Henrique suggested, that uses
merge().  This seems to be fine, although it might be possible
to squeeze some efficiency gains by using the fact that
the index vector is always sorted, which migh save some
searching time.

Any thoughts anyone?



best wishes

Robin




Benilton Carvalho wrote:
> library(Matrix)
> a = sparseMatrix(i=c(20, 30, 100000000), j=rep(1, 3), x=c(2.2, 3.3, 4.4))
> b = sparseMatrix(i=c(3, 30), j=rep(1, 2), x=c(0.1, 0.1), dims=dim(a))
> theSum = a+b
> summary(theSum)
>
>
> hth,
> b
>
> On Sep 8, 2009, at 10:19 AM, Henrique Dallazuanna wrote:
>
>> Try this:
>>
>> abMerge <- merge(a, b, by = 'index', all = TRUE)
>> list(index = abMerge$index, val = rowSums(abMerge[,2:3], na.rm = TRUE))
>>
>> On Tue, Sep 8, 2009 at 10:06 AM, Robin Hankin <rksh1 at cam.ac.uk> wrote:
>>
>>> Hi
>>>
>>> I deal with long vectors almost all of whose elements are zero.
>>> Typically, the length will be ~5e7 with ~100 nonzero elements.
>>>
>>> I want to deal with these objects using a sort of sparse
>>> vector.
>>>
>>> The problem is that I want to be able to 'add' two such
>>> vectors.
>>> Toy problem follows.  Suppose I have two such objects, 'a' and 'b':
>>>
>>>
>>>
>>>> a
>>> $index
>>> [1]    20   30 100000000
>>>
>>> $val
>>> [1] 2.2 3.3 4.4
>>>
>>>
>>>
>>>> b
>>> $index
>>> [1]   3  30
>>>
>>> $val
>>> [1] 0.1 0.1
>>>
>>>>
>>>
>>>
>>> What I want is the "sum" of these:
>>>
>>>> AplusB
>>> $index
>>> [1]    3   20   30 100000000
>>>
>>> $val
>>> [1]  0.1 2.2 3.4 4.4
>>>
>>>>
>>>
>>>
>>> See how the value for index=30 (being common to both) is 3.4
>>> (=3.3+0.1).   What's the best R idiom to achieve this?
>>>
>>>
>>>
>>> -- 
>>> Robin K. S. Hankin
>>> Uncertainty Analyst
>>> University of Cambridge
>>> 19 Silver Street
>>> Cambridge CB3 9EP
>>> 01223-764877
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>>
>>
>> -- 
>> Henrique Dallazuanna
>> Curitiba-Paraná-Brasil
>> 25° 25' 40" S 49° 16' 22" O
>>
>>        [[alternative HTML version deleted]]
>>
>> <ATT00001.txt>
>


-- 
Robin K. S. Hankin
Uncertainty Analyst
University of Cambridge
19 Silver Street
Cambridge CB3 9EP
01223-764877




More information about the R-help mailing list