Re: simple iteration question
- To: mathgroup at smc.vnet.net
- Subject: [mg89824] Re: simple iteration question
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 21 Jun 2008 05:32:59 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <g3g017$l06$1@smc.vnet.net>
Francisco Gutierrez wrote:
> 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
Assuming I have correctly understood what you are looking for and since
you did not show what you have already tried, I have chosen an approach
that blends procedural and functional programming paradigms. Definitely
not the best peace of code I ever written, but it has the merit to
exemplify the versatility of Mathematica. (Note that the code below has
not been extensively tested and that your specifications are sometimes
ambiguous.)
In[1]:= f[vec_, lst_, n_] :=
Module[{v = vec, test},
test[v1_, v2_] = v1.v2 - n >= 0;
If[Select[lst, test[v, #] &, 1] =!= {}, Return[v]];
For[i = 2, i <= Length[list], i++,
v += lst[[i]];
If[Select[lst, test[v, #] &, 1] =!= {}, Return[v]];
];
"No vectors were found."
]
list = {{3, 2, 1}, {5, 6, 1}, {10, 5, 1}};
vector = {1, 2, 3};
f[vector, list, 50]
f[vector, list, 1000]
Out[4]= {6, 8, 4}
Out[5]= "No vectors were found."
Regards,
-- Jean-Marc