Re: Problem with compile fct. and Thread
- To: mathgroup at smc.vnet.net
- Subject: [mg124609] Re: Problem with compile fct. and Thread
- From: kris <kristophs.post at web.de>
- Date: Thu, 26 Jan 2012 03:29:35 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jfm01p$js0$1@smc.vnet.net> <jforfd$62f$1@smc.vnet.net>
On 25 Jan., 13:10, "Oleksandr Rasputinov"
<oleksandr_rasputi... at hmamail.com> wrote:
> On Tue, 24 Jan 2012 10:10:01 -0000, kristoph <kristophs.p... at web.de> wrote:
> > Hi
>
> > I get an error when trying to compute the following "toy" code:
>
> > (*the compile function*)
> > test=Compile[{{bw,_Real},{regData,_Real,1},{leg,_Integer}},
> > Module[{h,tab2,xMat},
> > h=1;
> > tab2=Table[(regData[[i]]-regData[[j]]),{i,1,leg},{j,1,leg}];
> > xMat=Thread[{1.,tab2[[h]]}]
> > ]
> > ,CompilationOptions->{"InlineExternalDefinitions"->True}];
>
> > (*generating random sample data*)
> > leg=100;
> > data=RandomReal[{0,1},leg];
> > bw=.1;
>
> > (*using the compile function with the above generated data, produces
> > the error*)
> > test[bw, data, leg]
>
> > The function "test" works fine if I construct the matrix "xMat" using
> > the function Table. However, I prefer Thread because it is twice as
> > fast.
>
> > I just do not see where my mistake is. I do appreciate any
> > suggestions. Thanks in advance.
> > Cheers,
> > Kris
>
> The problem again is with the types of various expressions, but this time
> it is caused by a call out of the compiled code in evaluating Thread[...].
> In such cases one must explicitly specify the return type one expects for
> expressions matching a given pattern using the third argument of Compile,
> which in this case should be {{_Thread, _Real, 2}}:
>
> test = Compile[
> {{bw, _Real}, {regData, _Real, 1}, {leg, _Integer}},
> Module[{h = 1, tab2 = {{0., 0.}}, xMat = {{0., 0.}}},
> tab2 = Table[
> regData[[i]] - regData[[j]],
> {i, 1, leg}, {j, 1, leg}
> ];
> xMat = Thread[{1., tab2[[h]]}]
> ], {{_Thread, _Real, 2}},
> CompilationOptions -> {"InlineExternalDefinitions" -> True}
> ];
>
> A better way to write it is to avoid the call out of compiled code
> altogether. There also isn't any reason to use xMat here and it introduces
> a needless copy operation on the final result, so one may as well remove
> this too, ending up with the following:
>
> test2 = Compile[
> {{bw, _Real}, {regData, _Real, 1}, {leg, _Integer}},
> Module[{h = 1, tab2 = {{0., 0.}}},
> tab2 = Table[
> regData[[i]] - regData[[j]],
> {i, 1, leg}, {j, 1, leg}
> ];
> Transpose[{
> ConstantArray[1., Length@tab2[[h]]],
> tab2[[h]]
> }]
> ], CompilationOptions -> {"InlineExternalDefinitions" -> True}
> ];
>
> As is probably clear by now, the use of compiled code is not without its
> difficulties. (Also, incidentally, "InlineExternalDefinitions" -> True
> doesn't serve any purpose for this example, but I left it in anyway.)
Thanks a lot. This is very helpful!