Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I'm new to Mathematica, and was looking for more efficient ways to implement the Do loop below. a, b, c and d are all constants, but I'm also using a list in the loop. Is this possible to implement with NestList? I haven't been able to find any examples with a list being used inside of NestList.

Do[
X = Tanh[a.input[[i]] + b.X + c];
Y = d.X;
YOut = Append[YOut, Y];
 ,{i, Length[input]}];

Thanks!

*

Sorry for the confusion, I tried to simplify my code for the sake of brevity.

Do[
X = Tanh[Win.input[[i]] + Wres.X + Wbias]];
Y = WOUT.X;
YOut = Append[YOut, Y];
, {i, Length[input]}
];

Win, Wres, Wbias, and WOUT are all appropriately sized matrices. This do loop is part of a testing routine for Reservoir Computing, a type of machine learning.

With help from your answer, I'm rewriting the above as:

f = WOUT.(Tanh[Wbias + Win.#2 + WRes.#1]) &;
YOut = FoldList[f, X, input];

Will try it out now. Thanks for the help!

share|improve this question
2  
Asking a question you should provide always a minimal example of intended input. It saves time and effort of all mathematica.se users. –  Artes Aug 30 '13 at 19:48
add comment

1 Answer 1

up vote 5 down vote accepted

Taking into account clarification after editting the question I guess the most direct solution you are looking for is Fold (or FoldList) rather than Nest (or NestList) even though you might succeed with the latter. Regardless of objects a, b, c, d, X, Y etc. or Win, Wbias, WOUT, WRes being scalars or matrices we can proceed defining an appropriate function for the Fold construct.
At first let's define an example of matrix objects:

{a, b, c, d} = 
{{{1, 2}, {-1, 1}}, {{1, 0}, {0, -1}}, {{0, 1}, {1, 0}}, {{-2, 1}, {1, -1}}};
id = IdentityMatrix[2];
input = {0 id, 1 id, 2 id};

Next we can define for the following pure function:

 f = d.Tanh[ a.#2 + b.#1 + c]&;

then it yields YOut:

FoldList[ f, {{x11, x12}, {x21, x22}}, input]

while this yields the last entry of YOut:

Fold[f, {{x11, x12}, {x21, x22}}, input]

For example choosing

X = {{0, 0}, {0, 0}};

we have

Fold[ f, {{0, 0}, {0, 0}}, input] 
{{-2 Tanh[2 + Tanh[Tanh[1]] - 2 Tanh[1 + Tanh[1]]] 
  - Tanh[1 - Tanh[Tanh[1]] + Tanh[1 + Tanh[1]]], 
  -2 Tanh[ 5 - 2 Tanh[3 - 2 Tanh[1]] + Tanh[1 - Tanh[1]]] 
  + Tanh[2 - Tanh[3 - 2 Tanh[1]] + Tanh[1 - Tanh[1]]]}, 
 { Tanh[2 + Tanh[Tanh[1]] - 2 Tanh[1 + Tanh[1]]] 
  + Tanh[1 - Tanh[Tanh[1]] + Tanh[1 + Tanh[1]]], 
   Tanh[5 - 2 Tanh[3 - 2 Tanh[1]] + Tanh[1 - Tanh[1]]] 
  - Tanh[2 - Tanh[3 - 2 Tanh[1]] + Tanh[1 - Tanh[1]]]}}

Let's choose another example of scalar objects:

Clear[f, X, a, b, c, d, id, input]

input = {0, 1, 2};
{a, b, c, d} = {1, 2, 3, 4};
f = d Tanh[a #2 + b #1 + c] &;

then we have e.g.

Fold[ f, 0, input]
4 Tanh[ 5 + 8 Tanh[ 4 + 8 Tanh[3]]]
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.