Hi all. I have a little problem using Thread and MapThread, and although
I have found a way around it, I am still unhappy with it being there in
the first place.
I have a function (call it myF ) that takes as arguments FOUR vectors of
equal length (doesn't matter what length) -by vector I mean a List of
numbers with the simplest structure possible {x1, x2, ..... xN}- and
gives out a number. The only operations involved in getting the number
are addition, subtraction, multiplication and division. So I do
convolutions of one list with another, and things like that (although I
don't use ListConvolve).
I want to map this function over a bunch of lists in the following way:
For argument #1 I always want the same list xList={x1, x2, .....xN}
For argument #2 I have the list: yList={{a1,a2,...aN}, {b1,b2,...bN}}
and I want to apply the function first to the x's as argument #1 with
the a's as argument #2, and then to the x's as argument #1, with the b's
as argument #2. So far so good, and only need to map over the second
argument.
For argument #3 I have many lists. More exactly, I have a list
consisting of two NxN matrices:
cList={ { {Ca11,Ca12, ...Ca1N},{Ca21,Ca22, ...Ca2N},...{CaN1,Ca12,
...CaNN} },
{ {Cb11,Cb12, ...Cb1N},{Cb21,Cb22, ...Cb2N},...{CbN1,Cb12, ...CbNN} } }
similarly for argument #4
lList={ { {La11,La12, ...La1N},{La21,La22, ...La2N},...{LaN1,La12,
...LaNN} },
{ {Lb11,Lb12, ...Lb1N},{Lb21,Lb22, ...Lb2N},...{LbN1,Lb12, ...LbNN} } }
when I use the a's for argument #2 I want to go through and use the
first row in the Ca's for argument #3, and the first row in the La's for
argument #4, then the second row of each, etc Notice that I don't want
all the combination between the cList and the lList. When I am done with
that I go to the b's for argument #2, then I want to use the first rows
of Cb and Lb for arguments #3 and #4, then their second rows, etc.
This is what I do:
MapThread[ myF[xList,#1,#2,#3]&, {yList, cList, lList} ] this uses first
the first Parts of yList, cList and lList, and then their second Parts.
This produces { myF[ xList, {a1,a2,....aN}, matrix of Ca's, matrix of
La's], myF[xlIst, {b1,b2,..bN}, matrix of Cb's, matrix of Lb's]}
So far so good. Now I just need to Thread over the last two arguments:
Map[ Thread[#, List,-2]&, MapThread[ myF[xList,#1,#2,#3]&, {yList,
cList, lList} ] ] This threads the function myF over those arguments
just the way I wanted AS LONG AS the function myF has not been defined.
The minute I define the function myF to do what I want it to do (to
combine the four vectors in a certain way and produce a number) it
threads in a different way. Namely it threads as if using the Transpose
of the lists cList and lList. One solution is to use the Transpose in
the first place, so when they get Transposed again it would be just
fine, but this is still puzzling. Any ideas on what is going on and
suggestions on how to fix it (Transposing big matrices is a little slow)
would be appreciated. Otto Linsuain.