Re: simple iteration question-thanks
- To: mathgroup at smc.vnet.net
- Subject: [mg90048] Re: simple iteration question-thanks
- From: dh <dh at metrohm.ch>
- Date: Fri, 27 Jun 2008 06:17:12 -0400 (EDT)
- References: <g3vkjm$k6o$1@smc.vnet.net>
Hi Francisco,
your problem has the smell of Fold, but we need to break and return the
result. Breaking is easy, we may e.g. wrap the "Fold" with a "Do" and
use Break. There is an undocumentated feature: Break[] can take an
argument. We can use this to return the result:
vec={1,2,3};
list={{5,6,1},{10,5,1}};
fun[x1_,x2_]:=If[x1.x2-50>=0,Break[x1],x1+x2];
Do[Fold[fun,vec,list],{1}]
hope this helps, Daniel
Francisco Gutierrez wrote:
> Many thanks to Don, Jean Marc, and Oleksandr. Their ideas were very useful
> to solve my problem. Indeed, it implied using Fors and Ifs. I wonder if it
> is possible to express all this functionally and not procedurally; I couldn't find a way to do it.
> Best,
> Fg
>
> --- On Tue, 6/24/08, sashap <pavlyk at gmail.com> wrote:
>
> From: sashap <pavlyk at gmail.com>
> Subject: Re: simple iteration question
> Date: Tuesday, June 24, 2008, 5:17 AM
>
> On Jun 20, 5:16 am, Francisco Gutierrez <fgutiers2... at yahoo.com>
> wrote:
>> Dear Friends:
>> I have a list of the form list={{3,2,1},{5,6,1},{10,5,1}}, of any length
>> I have a vector, say vector={1,2,3}
>> I want to make the following iteration. Take the first component of the
>> list, make the dot product of it and the vector, and substract a number ( sa
> > y 50). If the result is bigger or equal than zero, stop and return the vect
> > or. If it is less than zero, then change the vector in the followig way: =
> =
> ve=
>> ctor+list[[2]], and repeat the test.
>> Iterate until the result is equal or bigger than zero, or until the list =
> =
> en=
>> ds.
>> I haven't found a neat way of doing this. Any help is welcome
>> Francisco
>>
>
> Hey Francisco,
>
> here is a short way of doing it:
>
> In[59]:= mat = {{3, 2, 1}, {5, 6, 1}, {10, 5, 1}};
> vec = {1, 2, 3};
>
> In[61]:= Catch[
> Fold[If[#1.#2 > 50, Throw[#1], #1 + mat[[2]]] &, vec, mat]]
>
> Out[61]= {6, 8, 4}
>
> Oleksandr Pavlyk=0A=0A=0A
>
--
Daniel Huber
Metrohm Ltd.
Oberdorfstr. 68
CH-9100 Herisau
Tel. +41 71 353 8585, Fax +41 71 353 8907
E-Mail:<mailto:dh at metrohm.com>
Internet:<http://www.metrohm.com>