Speeding Up Numerical Matrix Calculations ???
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1091] Speeding Up Numerical Matrix Calculations ???
- From: Paul E Howland <PEHOWLAND at taz.dra.hmg.gb>
- Date: Sun, 14 May 1995 21:11:31 -0400
It is common in many signal processing applications to formulate problems
in terms of simple functions of lots of matrices. Hence, I guess, the
existence of MATLAB.
My question is quite simple. Mathematica can be numerically very slow.
How can I speed up my numerical calculations involving matrices that
consist only of machine size numbers?
It appears that Mathematica handles numerical matrices in much the same
way as it does symbolic matrices. Here's a test I did using Mathematica
V2.2.3 on a 486/33 PC running Windows 3.1.
In[1]:= F[a_?MatrixQ, b_?MatrixQ, c_?MatrixQ] :=
Transpose[a]a + 3 b c + Transpose[c]c
In[2]:= NF[a_?MatrixQ, b_?MatrixQ, c_?MatrixQ] :=
N[Transpose[a]a + 3 b c + Transpose[c]c]
Thus I've defined two (arbitrary) functions that manipulate matrices.
NF is simply N[F] - I want to see whether wrapping N[] around a calculation
causes Mathematica to invoke some numerically optimised code.
Now generate some machine sized numerical matrices ...
In[3]:= a = Table[Random[], {i,10}, {j,10}];
In[4]:= b = Table[Random[], {i,10}, {j,10}];
In[5]:= c = Table[Random[], {i,10}, {j,10}];
And some symbolic matrices ...
In[6]:= x = Table[FromCharacterCode[Random[Integer, {100,122}]],
{i, 10}, {j,10}];
In[7]:= y = Table[FromCharacterCode[Random[Integer, {100,122}]],
{i, 10}, {j,10}];
In[8]:= z = Table[FromCharacterCode[Random[Integer, {100,122}]],
{i, 10}, {j,10}];
And compare timings. First compare F[] on both sets of data ...
In[9] := Timing[Do[F[a,b,c], {i,10}]]
Out[9] = {3.185 Second, Null}
In[10] := Timing[Do[F[x,y,z], {i,10}]]
Out[10] = {2.087 Second, Null}
thus the symbolic processing is faster (!). Now see what the effect
of wrapping N[] around the code is, for numerical data...
In[11] := Timing[Do[NF[a,b,c], {i,10}]]
Out[11] = {3.24 Second, Null}
... it makes it marginally slower! Presumably due to the extra time
required by Mathematica to interpret the N[] function.
It is not possible to use Compile[] on a function that accepts matrices
as arguments because Compile[] only accepts _Integer, _Real and _Complex
as its data types (and not _List).
Is there any means of getting Mathematica to manipulate numerical matrices
more quickly (other than using Matlab or writing a C program and then
using MathLink)? It would be nice if Mathematica was written such that
when N[] was wrapped around simple numerical matrix operations, optimised
numerical code was invoked.
Paul E Howland
Long Range Ground Radar Systems Section tel. +44 (0)1684 895767
LSC2 Division, Room BY209 fax. +44 (0)1684 896315
Defence Research Agency email: PEHOWLAND at DRA.HMG.GB
Malvern, Worcs, WR14 3PS, UK.
-----------------------------------------------------------------------------