Re: how to pick out alternating columns and rows in a matrix?
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg597] Re: [mg551] how to pick out alternating columns and rows in a matrix?
- From: Count Dracula <lk3a at kelvin.seas.virginia.edu>
- Date: Thu, 23 Mar 1995 08:41:37 -0500
The function definition in my previous message about this had an error in it.
The definition should have read:
Here's a definition for a function to select odd(default) or even (with
sel = EvenQ) rows and columns of a matrix:
altrowcol[(m_)?MatrixQ, sel_:OddQ] :=
m[[Apply[Sequence, (Select[Range[#1], sel] & ) /@ Dimensions[m]]]]
In [mg580] Tyler Perkins perkins at colorado.edu wrote:
> Always remember -- the heart of Mathematica is pattern matching.
> How 'bout this:
> In[1]:=
> OddOnly[{odd_, even_, rest___}] := Join[{odd}, OddOnly[{rest}]];
> OddOnly[singleton_] := singleton;
> OddOnly //@ {{11,12,13,14,15},
> {21,22,23,24,25},
> {31,32,33,34,35},
> {41,42,43,44,45},
> {51,52,53,54,55}}
> Out[3]=
> {{11, 13, 15}, {31, 33, 35}, {51, 53, 55}}
This recursive function works correctly, but is unduly complicated for
the task at hand and will be much slower than the direct approach. The
disadvantage in speed increases as the dimensions of the matrix increases.
Consider:
In[22]:= m = Array[a, {40,51}];
In[23]:= Timing[OddOnly //@ m][[1]]
Out[23]= 1.14 Second
In[24]:= Timing[altrowcol[m]][[1]]
Out[24]= 0.02 Second
In[25]:= altrowcol[m]==(OddOnly //@ m)
Out[25]= True
Now a matrix m with larger dimensions:
In[27]:= m = Array[a, {75, 87}];
In[28]:= Timing[OddOnly //@ m][[1]]
Out[28]= 4.27 Second
In[29]:= Timing[altrowcol[m]][[1]]
Out[29]= 0.04 Second
In[30]:= altrowcol[m]==(OddOnly //@ m)
Out[30]= True
___________________________________________________________________________________
Levent Kitis lk3a at cars.mech.virginia.edu lk3a at kelvin.seas.virginia.edu
University of Virginia Department of Mechanical, Aerospace and Nuclear Engineering
___________________________________________________________________________________