Subject: New function - makelist alternative: table()
From: Žiga Lenarčič
Date: Sun, 10 May 2009 11:09:33 +0200
Hi Maxima users and developers!
Dissatisfied with makelist inflexibility, I wrote my own function,
table() in lisp. It more or less covers all the features of
Mathematica's Table[] function (hence the name :) ).
I would like this function to be included into Maxima src. How can I
do that? I'm will write function documentation and unit tests (if
they are required).
Function was based on my inspection of $makelist function, but after
Andrej's tips, I used (mbindings) instead of $ev for evaluation and
function is now much faster than $makelist.
Compare:
%i4: makelist(i,i,1,1000000)$
Evaluation took 9.4030 seconds (9.7420 elapsed) using 259.399 MB.
%i7: table(i,[i,1000000])$
Evaluation took 2.9870 seconds (3.2280 elapsed) using 83.925 MB.
The result is the same.
Table is not only faster than $makelist, but also more featureful. To
be precise - $makelist covers only a small subset of table's
features. Copy paste from table.lisp:
;; From Maxima function can be called in the form:
;; table(expression, iterator1, iterator2,...);
;; At least one iterator is needed, further iterators are optional.
;; Iterators can have different forms.
;;
;; [number]
;; Evaluates expression 'number' times, where 'number' is a positive
integer and
;; produces a Maxima list of evaluated expressions.
;;
;; [variable, initial, end, step]
;; Returns a list of evaluated expressions where 'variable' (a
symbol) is set
;; to a value. First element of the returned list is expression
evaluated
;; with variable set to initial. i-th element of the returned list is
expression
;; evaluated with variable set to 'initial' + (i-1)*step. Last
element of the list is
;; expression evaluated with variable set to value which is less or
equal to 'end'.
;; 'initial', 'end' and 'step' can be integers or floating point
numbers.
;;
;; [variable, initial, end]
;; This iterator uses a step of 1 and is equal to [variable, initial,
end, 1].
;;
;; [variable, end]
;; This iterator uses a step of 1 and initial value is also 1,
therefore it's
;; equal to iterator [variable, 1, end, 1].
It is much easier to use than makelist, for instance a plot of a sine
+ noise:
plot2d( [discrete, table([t, sin(t)+random(0.2)], [t,0,10,0.1])] );
Not only lisp numbers - also maxima numbers can be used:
table(i, [i,1,10, 1/2]);
Makelist can be sped up by defining (just for fun)
makelist(a,b,c,d) := table(a, [b,c,d]);
I attached table.lisp. The name of the function can be changed, but
table is fine by me, since it's short, and syntax is the same as for
Table[].
If you find any bugs or have any suggestions about the code, please
tell, I will fix it.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: table.lisp
Type: application/octet-stream
Size: 12020 bytes
Desc: not available
Url : http://www.math.utexas.edu/pipermail/maxima/attachments/20090510/71584660/attachment.obj
-------------- next part --------------
Regards,
Ziga Lenarcic