Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: multiplying, element wise, a row by each column of a matrix.

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127145] Re: multiplying, element wise, a row by each column of a matrix.
  • From: èçå <xiehongyester at gmail.com>
  • Date: Mon, 2 Jul 2012 05:28:04 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <js1d1v$m8h$1@smc.vnet.net>

v = {v1, v2}
mat = {{a11, a12}, {a21, a22}, {a31, a32}}
(*Why  not try this?,I think this is very good and simple. *)
mat.DiagonalMatrix[v]
In[135]:= mat.DiagonalMatrix[v]
Out[135]= {{a11 v1, a12 v2}, {a21 v1, a22 v2}, {a31 v1, a32 v2}}



=E5=9C=A8 2012=E5=B9=B46=E6=9C=8822=E6=97=A5=E6=98=9F=E6=9C=9F=E4=BA=94UTC+=
8=E4=B8=8B=E5=8D=885=E6=97=B614=E5=88=8639=E7=A7=92=EF=BC=8CAlexei Boulbitc=
h=E5=86=99=E9=81=93=EF=BC=9A
> Any one can think of a better way to do this?
>
> The problem: Given a row vector
>
>     v={v1,v2}
>
> and matrix with same number of columns as v, such as
>
> mat={{a11, a12},
>       {a21, a22},
>       {a31, a32}};
>
> I need to multiply v1 by the first column, then
> multiply v2 by the second column. (i.e. scale each column
> of the matrix by the corresponding "weight" from the
> row).
>
> This results in
>
>   {{a11 v1, a12 v2},
>     {a21 v1, a22 v2},
>    {a31 v1, a32 v2}}
>
> I wanted to find a 'smart' way or good command to do
> it, but so far, had to do it the hard way. I'll show 2
> methods. May be you can find a better functional way
> to solve this:
>
> 1)
> Transpose[MapThread[#1 #2 &, {v, Transpose[mat]}]]
>
> This is not natural solution. need to transposes
> 2 times.
>
> 2)
> KroneckerProduct[{v[[#]]},mat[[All,#]]]&/@ Range[1,Length[v]]
> Transpose[Flatten[%, 1]]
>
> also not too natural. Faltten, transpose, etc... not good.
>
> Fyi, using another system, which starts with the letter
> 'O' and ends with the letters 'VE', I can do the above
> using
>
>        v .* mat
>
> Where the ".*" above means element by element product.
>
> I hope the experts here can find a short/better way to do
> this. I am sure there is, I just can't find it yet, and
> I am not happy with what I came up with so far.
>
> thanks,
> --Nasser
>
> Hi, Nasser,
>
> The scalar product (Dot[ ]) gives you almost the list like you need. Try =
this:
>
> Clear[v1, v2];
> mat = {{a11, a12}, {a21, a22}, {a31, a32}};
> v = {v1, v2};
>
> mat.v
>
> {a11 v1 + a12 v2, a21 v1 + a22 v2, a31 v1 + a32 v2}
>
> Now replace Plus by List:
>
> mat.v /. Plus -> List
>
> {{a11 v1, a12 v2}, {a21 v1, a22 v2}, {a31 v1, a32 v2}}
>
> Have fun, Alexei
>
>
> Alexei BOULBITCH, Dr., habil.
> IEE S.A.
> ZAE Weiergewan,
> 11, rue Edmond Reuter,
> L-5326 Contern, LUXEMBOURG
>
> Office phone :  +352-2454-2566
> Office fax:       +352-2454-3566
> mobile phone:  +49 151 52 40 66 44
>
> e-mail: alexei.boulbitch at iee.lu



  • Prev by Date: Re: case of inconsistent API between Drop and Part?
  • Next by Date: Re: How to rectify the error for NDSolve ?
  • Previous by thread: Re: How to export to Excel numbers as text fields?
  • Next by thread: How can I plot line with a color gradient instead of a solid color?