[R] sparse matrix from vector outer product
Philipp A.
flying-sheep at web.de
Thu Jan 15 09:09:18 CET 2015
thanks, that sounds good!
Martin Maechler <maechler at stat.math.ethz.ch> schrieb am Thu Jan 15 2015 at
09:07:04:
> >>>>> Philipp A <flying-sheep at web.de>
> >>>>> on Wed, 14 Jan 2015 14:02:40 +0000 writes:
>
> > Hi,
> > creating a matrix from two vectors a, b by multiplying each
> combination can
> > be done e.g. via
>
> > a %*% t(b)
>
> > or via
>
> > outer(a, b) # default for third argument is '*'
>
> really the best (most efficient) way would be
>
> tcrossprod(a, b)
>
> > But this yields a normal matrix.
> of course.
>
> Please always use small self-contained example code,
> here, e.g.,
>
> a <- numeric(17); a[3*(1:5)] <- 10*(5:1)
> b <- numeric(12); b[c(2,3,7,11)] <- 1:3
>
>
> > Is there an efficient way to create sparse matrices (from the Matrix
> > package) like that?
>
> > Right now i’m doing
>
> > a.sparse = as(a, 'sparseVector')
> > b.sparse = as(t(b), 'sparseMatrix')
> > a.sparse %*% b.sparse
>
> > but this strikes me as wasteful.
>
> not really wasteful I think. But there is a nicer and more efficient way :
>
> require(Matrix)
> tcrossprod(as(a, "sparseVector"),
> as(b, "sparseVector"))
>
> now also gives
>
> 17 x 12 sparse Matrix of class "dgCMatrix"
>
> [1,] . . . . . . . . . . . .
> [2,] . . . . . . . . . . . .
> [3,] . 50 100 . . . 150 . . . 50 .
> [4,] . . . . . . . . . . . .
> [5,] . . . . . . . . . . . .
> [6,] . 40 80 . . . 120 . . . 40 .
> [7,] . . . . . . . . . . . .
> [8,] . . . . . . . . . . . .
> [9,] . 30 60 . . . 90 . . . 30 .
> [10,] . . . . . . . . . . . .
> [11,] . . . . . . . . . . . .
> [12,] . 20 40 . . . 60 . . . 20 .
> [13,] . . . . . . . . . . . .
> [14,] . . . . . . . . . . . .
> [15,] . 10 20 . . . 30 . . . 10 .
> [16,] . . . . . . . . . . . .
> [17,] . . . . . . . . . . . .
> >
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list