MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: for cicle inside an If condition

  • To: mathgroup at smc.vnet.net
  • Subject: [mg118631] Re: for cicle inside an If condition
  • From: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
  • Date: Wed, 4 May 2011 19:49:13 -0400 (EDT)

Hi,

the error message suggests, that you give Select nothing where it really
*can* select something from. For instance 

Select[43, # < 4 &]

would try to select any part from 43 which is smaller than 4. This makes
no sense and Mathematica tells you so.

Ok, start from the beginning. You have a matrix of numbers (!!). Lets
take an example: Say this is the first row of your matrix:

{4.05249, 2.0836, 3.82281, 1.68126, 4.57036, 0.697649, 7.66875,
2.77411, 1.87648}

When I look into your code it suggests that the first number here is the
idGRB, the second is z, the third is fx and so on. So we have

{idGRB_, z_, fx_, fxErr_, beta_, dbeta_, logTarest_, logTaErrrest_, 
class_}

I know that class is not at ninth position, but its only a sample and
you'll have to adjust this anyway.
Lets create a matrix with 20 randomly chosen rows of length 9 like the
above one:

data = RandomReal[{0, 10}, {20, 9}]

You want know only those rows which have at second position "z" a value
smaller than 4.05 or exactly 5.2 or 8.26. *Here* you use the Select to
create a new matrix where only those rows are in, which fulfill this
condition:

data2 = Select[data, 
  With[{z = #[[2]]}, z <= 4.05 || z == 5.2 || z == 8.26] &]

Now write yourself a function which takes *one* row and creates the
output you want for this one row. (I simplified the calculation of the
lx!)

func[{idGRB_, z_, fx_, fxErr_, beta_, dbeta_, logTarest_, 
   logTaErrrest_, class_}] := 
 With[{lx = 4 + z + beta*fx, Om = 1, Ol = 1}, {logTarest, Log[10, lx],
    z, idGRB, Om, Ol}]

When you have this function, then you do nothing more than apply it to
every row of data2 and you have your result:

func /@ data2

I hope you noticed, that you don't need an explicit loop, you don't need
to append your current result to a global list and you don't need to
extract all the values (like idGRB) for each iteration. 

Cheers
Patrick


On Wed, 2011-05-04 at 12:08 +0100, maria giovanna dainotti wrote:
> Hi Patrick,
> Thanks a lot for your replay. I will try to explain better my problem.
>  
> DataGRB is a matrix, so z is a row vector 
>  
> The Select command right of the /@ just extracts all values smaller
> than
> 4. Then you "map" (which is the operator /@) the function (#^2&) over
> these values.
> 
> I included it in the code, but it gives the same error message:
> Nonatomic expression expected at position 1 in Select z= "1.29"
>  
> My aim is to take in the loop every single values of z<4.05, but once
> per time not alltogether.
> For example here below I put manually  the first value of z==0.84, in
> order to have (z==0.84 ||z==4.05||z==5.2||z==8.26)
> so the aim is to choose from the following list of z value that are
> stored in DataGRB[[i,2]] every value that is smaller than u, but
> picking only once per loop.
>  At the end I should have many quadruplets as the number of
> Length[DataGRB]-3 where 3 are these three values of z   ||z==4.05||
> z==5.2||z==8.26. 
> For example the second quadruplet could be  (z==1.29 ||z==4.05||
> z==5.2||z==8.26)
> the third one : (z==1.95 ||z==4.05||z==5.2||z==8.26)
> If it is not clear, could I send you the notebook?
> I will be very grateful if you could help me.
> This is the list of z and below the loop.
> Thanks a lot
> Cheers
> Maria
>  
>  
> z= 1.29
> 
> z= 1.95
> 
> z= 1.44
> 
> z= 3.24
> 
> z= 2.9
> 
> z= 0.65
> 
> z= 2.82
> 
> z= 0.26
> 
> z= 3.97
> 
> z= 1.38
> 
> z= 1.71
> 
> z= 0.42
> 
> z= 2.61
> 
> z= 0.83
> 
> z= 3.35
> 
> z= 2.2
> 
> z= 0.94
> 
> z= 2.35
> 
> z= 0.08
> 
> z= 0.55
> 
> z= 2.03
> 
> z= 3.53
> 
> z= 2.3
> 
> z= 0.78
> 
> z= 3.91
> 
> z= 1.49
> 
> z= 1.51
> 
> z= 0.44
> 
> z= 3.21
> 
> z= 2.68
> 
> z= 3.8
> 
> z= 3.08
> 
> z= 0.13
> 
> z= 3.43
> 
> z= 2.71
> 
> z= 0.54
> 
> z= 0.84
> 
> z= 0.7
> 
> z= 3.69
> 
> z= 2.43
> 
> z= 0.94
> 
> z= 0.44
> 
> z= 1.26
> 
> z= 1.31
> 
> z= 2.35
> 
> z= 1.17
> 
> z= 1.49
> 
> z= 0.97
> 
> z= 2.31
> 
> z= 0.82
> 
> z= 1.16
> 
> z= 0.92
> 
> z= 3.63
> 
> z= 0.46
> 
> z= 2.45
> 
> z= 0.22
> 
> z= 2.17
> 
> z= 2.15
> 
> z= 2.69
> 
> z= 0.38
> 
> z= 2.42
> 
> z= 1.51
> 
> z= 0.77
> 
> z= 1.55
> 
> z= 2.69
> 
> z= 3.35
> 
> z= 1.97
> 
> 
>  DataGoodclosed={};
> > Do[
> > logTarest=DataGRB[[i,7]];
> > logTaErrrest=DataGRB[[i,8]];
> > Fx=DataGRB[[i,3]];
> > FxErr=DataGRB[[i,4]];
> > idGRB=DataGRB[[i,1]];
> > z=DataGRB[[i,2]];
> > class=DataGRB[[i,12]];
> > beta=DataGRB[[i,5]];
> > dbeta=DataGRB[[i,6]];
> > If[class==33 && (z==0.84 ||z==4.05||z==5.2||z==8.26),
> > 
> > Lx=4*p*dLclosed[z,Om,Ol,h]2*(1+z)-(1+beta)*Fx; 
> > logLx=Log[10,Lx];
> > AppendTo[DataGoodclosed,{logTarest,logLx,z,idGRB,Om,Ol}]],
> > {i,1,Length[DataGRB]}];
> 
> 
> 
> 
> ______________________________________________________________________
> Da: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
> A: maria giovanna dainotti <mariagiovannadainotti at yahoo.it>
> Cc: mathgroup at smc.vnet.net
> Inviato: Sab 30 aprile 2011, 04:52:43
> Oggetto: Re: [mg118463] for cicle inside an If condition
> 
> Hi,
> 
> in the middle of your Do loop, you say
> 
> z = DataGRB[[i, 2]];
> 
> after this line z has the value of DataGRB[[i,2]]. In your If clause
> you
> go on with a condition
> 
> z == DataGRB[[i, 2]] < 4
> 
> What's that supposed to do? Remember z has already the value
> DataGRB[[i,2]]. So if DataGRB[[i, 2]] has for instance the value 5,
> then
> you leave 
> 
> 5 == 5 < 4 
> 
> for Mathematica to eveluate. Is that really what you want? 
> 
> Furthermore, it is really hard to give you some helpful advise,
> because
> it's not really clear what DataGRB is. Is it a matrix, a higher
> tensor, ...?
> 
> But about Select: Say you have a list of numbers and want to go
> through
> all numbers that are smaller 4 and square them and give the result
> back.
> Then this is really easy:
> 
> data = {11, 2, 1, 8, 11, 13, 8, 13, 1, 0, 7, 20, 17, 2, 3, 4, 7, 4};
> (#^2 &) /@ Select[data, # < 4 &]
> 
> The Select command right of the /@ just extracts all values smaller
> than
> 4. Then you "map" (which is the operator /@) the function (#^2&) over
> these values. End.
> 
> Try to include it in your code. And try to get rid of these useless
> loops. Nest, NestWhile, NestList, Fold, Map, MapThread,
> MapIndexed, ...
> are much better choices.
> 
> Cheers
> Patrick
> 
> On Fri, 2011-04-29 at 07:30 -0400, maria giovanna dainotti wrote:
> > Dear Mathematica Group,
> > I am trying to figure out the following Problem:
> > In the loop below I have to choose only 4 values of z the first one
> should vary from the table DataGRB[[i,2]] while the other ones are
> fixed, namely  
> > ||z==4.05||z==5.2||z==8.26 .
> > The problem is that 
> > Writing in this way as below I will have all the value of
> DataGRB[[i,2]]<4 
> > instead I would like to pick only one value per time in order that I
> should have the computation for the Lx for all the possible different
> four values of z, 
> > namely each z[[i]]<4.05 and the three mentioned value of z.
> > 
> > 
> > DataGoodclosed={};
> > Do[
> > logTarest=DataGRB[[i,7]];
> > logTaErrrest=DataGRB[[i,8]];
> > Fx=DataGRB[[i,3]];
> > FxErr=DataGRB[[i,4]];
> > idGRB=DataGRB[[i,1]];
> > z=DataGRB[[i,2]];
> > class=DataGRB[[i,12]];
> > beta=DataGRB[[i,5]];
> > dbeta=DataGRB[[i,6]];
> > If[class==33 && (z==DataGRB[[i,2]]<4 ||z==4.05||z==5.2||z==8.26),
> > 
> > Lx=4*p*dLclosed[z,Om,Ol,h]2*(1+z)-(1+beta)*Fx; 
> > logLx=Log[10,Lx];
> > AppendTo[DataGoodclosed,{logTarest,logLx,z,idGRB,Om,Ol}]],
> > {i,1,Length[DataGRB]}];
> > 
> > I thought about a for loop or a select, but when I introduce in the
> loop 
> > for example this one:
> >  For[i=1,i<=78,i++,
> > {Select[z[[i]],#<4&]}]
> > 
> > It gives the following error message:Select::normal: 
> >  
> > Nonatomic expression expected at position 1 in Select z= "1.29"
> > 
> > I would be very grateful if you could help me.
> > 
> > Thanks a lot in advance,
> > 
> > Cheers
> > 
> > Maria
> > 
> 
> 
> 




  • Prev by Date: Re: anything faster than Solve[] for solving sets of polynomial equations symbolically?
  • Next by Date: Re: Expected value of the Geometric distribution
  • Previous by thread: Re: Creating an audio
  • Next by thread: Re: for cicle inside an If condition