Re: More Efficient Method
- To: mathgroup at smc.vnet.net
- Subject: [mg105120] Re: More Efficient Method
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sat, 21 Nov 2009 03:36:15 -0500 (EST)
On 11/20/09 at 6:38 AM, blamm64 at charter.net (blamm64) wrote:
>I have a couple of functions designed to poke a single hole, and to
>poke multiple holes, in a one-level list:
>We define a function which, given the imported pressure data, finds
>the subset of that pressure data excluding the pressure data points
>between "targetL " and "targetU".
>In[5]:= findsubset[data_?VectorQ,targetL_?NumericQ,targetU_?
>NumericQ] := Select[data,(#<=targetL || #>=targetU &)]
on my machine the following has the same result but executes faster
fs[data_?VectorQ, targetL_?NumericQ, targetU_?NumericQ] :=
Join[SparseArray[Clip[data, {First[data], targetL}, {0, 0}]] /.
SparseArray[_, _, _, {_, _, a_}] -> a,
SparseArray[Clip[data, {targetU, Last[data]}, {0, 0}]] /.
SparseArray[_, _, _, {_, _, a_}] -> a]
>This function will pluck out multiple holes in the data list.
>In[6]:= subsets[data_?VectorQ,tarList_?ListQ]:=Module[{tmp,tmp1},
>tmp=data;
>Do[tmp1=findsubset[tmp,tarList[[i,1]],tarList[[i,2]]];tmp=tmp1,
>{i,Dimensions[tarList][[1]]}]; tmp
>]
I the following does the same thing is simpler in my view
subs[data_?VectorQ, tarList_?ListQ] :=
Fold[fs[#1, First[#2], Last[#2]] &, data, tarList]
>The following works fine (big holes chosen not to give large
>result):
>In[7]:= datalist=Range[11,3411,10];
>In[12]:= targetlist={{40, 1500},{1600,3300}};
=46irst to demonstrate the my solution produces the same result
In[7]:= subs[datalist, targetlist] == subsets[datalist, targetlist]
Out[7]= True
and then timing data on my system
In[8]:= Timing[subsets[datalist, targetlist];]
Out[8]= {0.000894,Null}
In[9]:= Timing[subs[datalist, targetlist];]
Out[9]= {0.000175,Null}