Re: Chain Matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg96499] Re: Chain Matrix
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 14 Feb 2009 04:14:55 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <gn3bvk$q50$1@smc.vnet.net>
In article <gn3bvk$q50$1 at smc.vnet.net>, Antonio Carlos Siqueira <antoniocslima71 at gmail.com> wrote: > I have a matrix in which all the elements are function of a scalar h, > Say q[h]={{q1,q2},{q3,q4}} and what I need is to create a chain matrix > so I can obtain the dot product of several q[h]. For instance, if h= > {h1,h2,h3} > I can create a large matrix with > m=Map[q,h] > Then I do > Dot[m[[1]],m[[2],m[[3] ] > > The problem is that there are cases where the Length[h] may reach a > few hundreds and I do not want to write Dot[m[[1]], ..., m[[200]] ] > So I have a somewhat trivial question: > Is there any way I can do this automatically? I mean how can I create > a function to create an equivalent matrix from a chain of matrices? > I tried some solutions with thread and fold, but I did not get > anywhere, any thoughts are appreciated. If your matrices are stored within a list, as suggested by the syntax m[[1]], etc., your could use either Dot[Sequence @@ m] or Fold[#1.#2 &, First[m], Rest[m]] for instance. In[1]:= m = Array[#, {2, 2}] & /@ {h1, h2, h3} Out[1]= {{{h1[1, 1], h1[1, 2]}, {h1[2, 1], h1[2, 2]}}, {{h2[1, 1], h2[1, 2]}, {h2[2, 1], h2[2, 2]}}, {{h3[1, 1], h3[1, 2]}, {h3[2, 1], h3[2, 2]}}} In[2]:= Dot[m[[1]], m[[2]], m[[3]]] Out[2]= {{(h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 1] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 1], (h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 2] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 2]}, {(h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 1] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 1], (h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 2] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 2]}} In[3]:= Dot[Sequence @@ m] Out[3]= {{(h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 1] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 1], (h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 2] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 2]}, {(h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 1] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 1], (h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 2] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 2]}} In[4]:= % === %% Out[4]= True In[5]:= Fold[#1.#2 &, First[m], Rest[m]] Out[5]= {{(h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 1] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 1], (h1[1, 1] h2[1, 1] + h1[1, 2] h2[2, 1]) h3[1, 2] + (h1[1, 1] h2[1, 2] + h1[1, 2] h2[2, 2]) h3[2, 2]}, {(h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 1] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 1], (h1[2, 1] h2[1, 1] + h1[2, 2] h2[2, 1]) h3[1, 2] + (h1[2, 1] h2[1, 2] + h1[2, 2] h2[2, 2]) h3[2, 2]}} In[6]:= % === %%% Out[6]= True Regards, --Jean-Marc