Re: Changing delayed formula
- To: mathgroup at smc.vnet.net
- Subject: [mg35474] Re: [mg35461] Changing delayed formula
- From: Tomas Garza <tgarza01 at prodigy.net.mx>
- Date: Sun, 14 Jul 2002 06:19:49 -0400 (EDT)
- References: <200207130749.DAA08590@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hola Julio! You might try a little functional programming, one of the beauties of Mathematica. I propose the following (written in a hurry, so I expect there will be some improvements on it): In[1]:= des = {{11, 12, 13, 14}, {21, 22, 23}, {31, 32}, {41, 42, 43, 44, 45}}; To start with, you may obtain the Lengths of the sublists directly with Map: In[2]:= Length /@ des Out[2]= {4, 3, 2, 5} Now, use Outer, which together with Flatten and Partition will construct succesive combinations of the elements of your lists. For example (here you don't need to partition yet), In[3]:= a1 = Flatten[Outer[List, des[[1]], des[[2]]], 1] Out[3]= {{11, 21}, {11, 22}, {11, 23}, {12, 21}, {12, 22}, {12, 23}, {13, 21}, {13, 22}, {13, 23}, {14, 21}, {14, 22}, {14, 23}} You may now use Fold, but first define the function In[4]:= f[x_, j_] := Partition[Flatten[Outer[List, x, des[[j + 1]], 1]], j + 1] and now In[5]:= Fold[f, des[[1]], Range[3]] will get you where you want (I omit the output). Tomas Garza Mexico City ----- Original Message ----- From: "Julio Vera" <jvera at adinet.com.uy> To: mathgroup at smc.vnet.net Subject: [mg35474] [mg35461] Changing delayed formula > > Hi, > > I have a list of lists. it's length (the number of sublists it > contains) varies. > > In[1]:= des={{11,12,13,14},{21,22,23},{31,32},{41,42,43,44,45}} > > Out[1]:= {{11,12,13,14},{21,22,23},{31,32},{41,42,43,44,45}} > > The length of each of the sublists is arbitrary, too. So I have this > list of lengths. > > In[2]:= elems=Flatten[Table[Dimensions[des[[i]]],{i,Length[des]}]] > > Out[2]:= {4,3,2,5} > > I want to obtain the list of all combinations of one element of each > sublist, bounded by &&. This will be a list of 120 elements, each of > them with 4 components. I define a delayed formula, and apply Array to > it (the characters printed as bold are subscripts in the Mathematica > notebook). > > In[3]:= > cond4[a_,b_,g_,d_]:=des[[1,a]]&&des[[2,b]]&&des[[3,g]]&&des[[4,d]] > > In[4]:= combi=Flatten[Array[condLength[des],elems]] > > Out[4]:= > {11&&21&&31&&41,11&&21&&31&&42,11&&21&&31&&43,11&&21&&31&&44,... > > ...14&&23&&32&&42,14&&23&&32&&43,14&&23&&32&&44,14&&23&&32&&45} > > Since the length of des varies, I would have to define cond each time. > For instance: > > cond3[a_,b_,g_,d_]:=des[[1,a]]&&des[[2,b]]&&des[[3,g]] > > I would like to make a definition for cond that would adapt to these > changes automatically. > > I arrived to this solution, which is not rejected by Mathematica, but > does not work, either. > > In[5]:= d[a_,b_]:=des[[a,b<>"_"]] > > In[6]:= Unprotect[ReplaceAll] > > Out[6]:= {ReplaceAll} > > In[7]:= > condLength[des][Table[FromCharacterCode[944+i]<>"_",{i,Length[des]}]]/.{a__} =AEa:=Apply[And,Table[d[i,FromCharacterCode[944+i]<>"_"],{i,Length[des]}]] > > In fact, I quit the kernel and rerun all the cells except the one > written here as In[3]. If not, the definition for cond4 remains as it > was. I was not able to clear cond4 individually. > > Thanks very much for anything you can suggest. > > Best regards, > > Julio Vera > >
- References:
- Changing delayed formula
- From: "Julio Vera" <jvera@adinet.com.uy>
- Changing delayed formula