[Numpy-discussion] fastest way to do multiplication with diagonal matrices from left or right

Pietro Berkes berkes at gatsby.ucl.ac.uk
Mon Mar 26 12:55:47 EDT 2007


This is a small function I use to speed up multiplication with diagonal
matrices. I don't know if it's the *fastest* way to do it, but it's
pretty fast.

def mult_diag(d, mtx, left=True):
    """Multiply a full matrix by a diagonal matrix.
    This function should always be faster than dot.

    Input:
      d -- 1D (N,) array (contains the diagonal elements)
      mtx -- 2D (N,N) array

    Output:
      mult_diag(d, mts, left=True) == dot(diag(d), mtx)
      mult_diag(d, mts, left=False) == dot(mtx, diag(d))
    """
    if left:
        return (d*mtx.T).T
    else:
        return d*mtx


On Fri, 23 Mar 2007, daniel.egloff at zkb.ch wrote:

> 
> 
> Dear list
> 
> what is the fastet way to multiply with a diagonal matrix from left or
> right and without to build a square matrix from the diagonal.
> Here it what I am looking for:
> 
> import numpy as N
> 
> def diagmult(X, Y):
>     """
>     Matrix multiplication X*Y where either X or Y is a diagonal matrix.
>     """
>     if X.ndim == 1 and Y.ndim == 2:
>         R = Y.copy()
>         for i, d in enumerate(X):
>             R[i,:] *= d
>         return R
>     elif X.ndim == 2 and Y.ndim == 1:
>         R = X.copy()
>         for i, d in enumerate(Y):
>             R[:,i] *= d
>         return R
>     elif X.ndim == 1 and Y.ndim == 1:
>         return X*Y
>     else
>         raise ValueError('diagmult dimension mismatch X.ndim = %d, Y.ndim =
> %d' % (X.ndim, Y.ndim))
> 
> Freundliche Grüsse
> Daniel Egloff
> Zürcher Kantonalbank
> Leiter(in) Financial Computing, ZEF
> 
> Josefstrasse 222, 8005 Zürich
> Telefon 044 292 45 33, Fax 044 292 45 95
> Briefadresse: Postfach, 8010 Zürich, http://www.zkb.ch
> ___________________________________________________________________
> 
> Disclaimer:
> 
> 
> Diese Mitteilung ist nur fuer die Empfaengerin / den Empfaenger bestimmt.
> 
> Fuer den Fall, dass sie von nichtberechtigten Personen empfangen wird,
> bitten wir diese hoeflich, die Mitteilung an die ZKB zurueckzusenden und
> anschliessend die Mitteilung mit allen Anhaengen sowie allfaellige Kopien
> zu vernichten bzw. zu loeschen. Der Gebrauch der Information ist verboten.
> 
> 
> This message is intended only for the named recipient and may contain
> confidential or privileged information.
> 
> If you have received it in error, please advise the sender by return e-mail
> and delete this message and any attachments. Any unauthorised use or
> dissemination of this information is strictly prohibited.


More information about the NumPy-Discussion mailing list