My challenge
- To: mathgroup at yoda.ncsa.uiuc.edu
- Subject: My challenge
- From: David Jacobson <jacobson at cello.hpl.hp.com>
- Date: Fri, 9 Aug 91 20:07:42 pdt
A couple of weeks ago I challenged the group to find better ways to write expressions that operate on a column of a matrix. It is clear that I didn't express myself very clearly, bacause of the wide variety of replies I got. Several people suggested recursive solutions. That might work fine for small problems, but in my work I'm often dealing with traces of I/O activity from a computer system, so the "matrix" is really a list of ordered pairs that is frequently 10000 to 50000 pairs long! Recursion wouldn't cut it. (One trace is over 500000 long, but even my 23 MIPS HP workstation, Mathematica runs too slowly for that one.) Several people also suggested interactive ways of doing it, i.e. they assumed that the list was held in a variable and I wanted to change it in place. I really wanted something that could operate on an expression, producing another expression that could be used, for example, in ListPlot. I also got several suggestions of functions that could do it. That was not really what I had in mind: I was looking for a way to do it concisely with just built-in Mathematica operators. But no such concise way was forthcoming. The best function was one suggested by Karl Frederick Arrington, who suggested mapOnCol[ f_, m_List, column_Integer ] := Transpose[MapAt[f, Transpose[m], {column}]]; SetAttributes[mapOnCol,HoldFirst]; mapOnCol::usage = "mapOnCol[function,matrix,column] \n applies the function only to the the column specified."; and: RunningSum[v_] := Accumulate[Plus,v]; I have put these in a library that I load at the beginning of my session. Actually, I've changed his mapOnCol to OpOnCol, since to me mapping means going down a list doing something to each element. Now instead of writing Transpose[{Transpose[z][[1]],Accumulate[Plus,Transpose[z][[2]]]}] I just write OpOnCol[RunningSum,z,2] Thanks Karl. -- David Jacobson