[petsc-users] forming a matrix from a set of vectors

Patrick Sanan patrick.sanan at gmail.com
Wed Aug 26 16:02:41 CDT 2015


On Wed, Aug 26, 2015 at 10:41 PM, Nicolas Pozin <nicolas.pozin at inria.fr>
wrote:

> Actually I want to get the diagonal of the matrix : transpose(d)*A*d where
> -d is a sparse matrix of size (n1,m1)
> -A is a dense symetric matrix of size size (n1,n1)
> with m1 very big compared to n1 (1 million against a few dozens).
>
If I read this correctly, another way to phrase what you need is
||d_i||_A^2 = <d_i,Ad_i>, for a few dozen values of i . Naively you could
do that by iterating through an array of Vec objects (which need not all be
stored in memory simultaneously), calling MatMult followed by VecDot. You
could perhaps get more clever later (if the size of the system justifies
it) by doing things like using non-blocking/split versions of VecDot (or
VecMDot) so that you can overlap the matrix multiplications with the dot
products.

>
> The problem is too big to allow the use of MatMatMult.
> What I planned to do :
> -compute the vectors Vi defined by transpose(d)*Ai where Ai is the i-th
> column of A : quick since d is sparse and n1 is small
> -deduce the matrix transpose(d)*A = [V1 ... Vn]
> and then get the diagonal of transpose(d)*transpose([V1 ...Vn]) through
> -transpose([V1 ...Vn]) and get its columns C1 ... Cn
> -conclude on the i-th diagonal value which is the i-th component of
> tranpose(d)*Ci
>
>
>
> ----- Mail original -----
> > De: "Barry Smith" <bsmith at mcs.anl.gov>
> > À: "Nicolas Pozin" <nicolas.pozin at inria.fr>
> > Cc: "Jed Brown" <jed at jedbrown.org>, petsc-users at mcs.anl.gov
> > Envoyé: Mercredi 26 Août 2015 22:21:04
> > Objet: Re: [petsc-users] forming a matrix from a set of vectors
> >
> >
> > > On Aug 26, 2015, at 3:06 PM, Nicolas Pozin <nicolas.pozin at inria.fr>
> wrote:
> > >
> > > Thank you for this answer.
> > >
> > > What I want to do is to get the lines of this matrix and store them in
> > > vectors.
> >
> >   If you want to treat the columns of the dense matrix as vectors then
> use
> >   MatDenseGetArray() and call VecCreateMPIWithArray() with a pointer to
> the
> >   first row of each column of the obtained array (PETSc dense matrices
> are
> >   stored by column; same as for example LAPACK).
> >
> >   But if you explained more why you want to treat something sometimes as
> a
> >   Mat (which is a linear operator on vectors) and sometimes as vectors we
> >   might be able to suggest how to organize your code.
> >
> >    Barry
> >
> > >
> > >
> > > ----- Mail original -----
> > >> De: "Jed Brown" <jed at jedbrown.org>
> > >> À: "Nicolas Pozin" <nicolas.pozin at inria.fr>, petsc-users at mcs.anl.gov
> > >> Envoyé: Mercredi 26 Août 2015 20:38:37
> > >> Objet: Re: [petsc-users]  forming a matrix from a set of vectors
> > >>
> > >> Nicolas Pozin <nicolas.pozin at inria.fr> writes:
> > >>> Given a set of vectors V1, V2,...,Vn, is there an efficient way to
> form
> > >>> the
> > >>> dense matrix [V1 V2 ... Vn]?
> > >>
> > >> What do you want to do with that matrix?  The vector representation is
> > >> pretty flexible and the memory semantics are similar unless you store
> > >> the dense matrix row-aligned (not the default).
> > >>
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150826/4921ba39/attachment-0001.html>


More information about the petsc-users mailing list