Re: Could this be improved?
- To: mathgroup at smc.vnet.net
- Subject: [mg21791] Re: Could this be improved?
- From: "Luci Ellis" <elisha at dot.net.au>
- Date: Thu, 27 Jan 2000 22:57:28 -0500 (EST)
- References: <86mdpv$2f3@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi Jordan, I have a two, largely similar, suggestions. They both cut the time taken roughly in half, although both your version and mine are roughly quadratic in time. Test data: arr[100] = Array[f, 100]; arr[300] = Array[f, 300]; arr[500] = Array[f, 500]; arr[700] = Array[f, 700]; arr[900] = Array[f, 900]; arr[1100] = Array[f, 1100]; Your version: myMtx[v_] := Module[ {nCols, nRows, vPadded, c}, nCols = Length[v]; nRows = 2nCols - 1; c = ZeroMatrix[nRows, nCols]; vPadded = PadRight[v, nRows, 0]; For[i = 1, i <= nCols, i++, c[[All, i]] = vPadded; vPadded = RotateRight[vPadded] ]; c ] Timing[myMtx[arr[100]];] {0.15 Second, Null} Timing[myMtx[arr[300]];] {1.18333 Second, Null} Timing[myMtx[arr[500]];] {3.46667 Second, Null} Timing[myMtx[arr[700]];] {6.86667 Second, Null} Timing[myMtx[arr[900]];] {11.65 Second, Null} My versions: Note the absence of a loop, and that there aren't local variables being defined and redefined, which is very time-consuming. Also I tend to use With[] rather than Module[]. With[] is for defining local _constants_, rather than local variables, and is apparently a bit faster than Module in that context. (See David Wagner's "Power Programming in Mathematica" book, which I recommend if you do want to become more familiar with the Mathematica way of programming). myMtx2[v_] := With[{nCols = Length[v]}, With[{vPadded = PadRight[v, 2 nCols - 1, 0]}, Transpose[Table[RotateRight[vPadded, i], {i, 0, nCols - 1}]] ]] myMtx3[v_] := With[{nCols = Length[v]}, With[{vPadded = PadRight[v, 2 nCols - 1, 0]}, Transpose[RotateRight[vPadded, #] & /@ Range[0, nCols - 1]] ]] Timing results: Timing[myMtx2[arr[100]];] {0.05 Second, Null} Timing[myMtx2[arr[300]];] {0.566667 Second, Null} Timing[myMtx2[arr[500]];] {1.68333 Second, Null} Timing[myMtx2[arr[700]];] {3.3 Second, Null} Timing[myMtx2[arr[900]];] {5.71667 Second, Null} Timing[myMtx3[arr[100]];] {0.0666667 Second, Null} Timing[myMtx3[arr[300]];] {0.566667 Second, Null} Timing[myMtx3[arr[500]];] {1.68333 Second, Null} Timing[myMtx3[arr[700]];] {3.3 Second, Null} Timing[myMtx3[arr[900]];] {5.7 Second, Null} Others may have better ideas, but nonetheless I hope this helps. Regards, Luci ---------- In article <86mdpv$2f3 at smc.vnet.net>, "Jordan Rosenthal" <jr at ece.gatech.edu> wrote: > Hi all, > > I wrote the following code which works correctly. I was wondering, however, > if there was a way of doing the same thing that had more of a Mathematica > approach. I am new to Mathematica and am still trying to get a grasp on how > to program effectively within the environment. > > myMtx[v_] := Module[ > {nCols, nRows, vPadded, c}, > nCols = Length[v]; > nRows = 2nCols - 1; > c = ZeroMatrix[nRows, nCols]; > vPadded = PadRight[v, nRows, 0]; > For[i = 1, i <= nCols, i++, > c[[All, i]] = vPadded; > vPadded = RotateRight[vPadded] > ]; > c > ] > > For example, myMtx[{1,2,3}] takes the vector {1,2,3} and turns it into the > matrix {{1, 0, 0}, {2, 1, 0}, {3, 2, 1}, {0, 3, 2}, {0, 0, 3}} which looks > like > > [ 1 0 0 ] > [ 2 1 0 ] > [ 3 2 1 ] > [ 0 3 2 ] > [ 0 0 3 ] > > > Thanks, > > Jordan > > > > >