Re: Matrix norms? ..
- To: mathgroup at smc.vnet.net
 - Subject: [mg6793] Re: Matrix norms? ..
 - From: Daniel Lichtblau <danl>
 - Date: Sun, 20 Apr 1997 01:50:32 -0400 (EDT)
 - Organization: Wolfram Research, Inc.
 - Sender: owner-wri-mathgroup at wolfram.com
 
Chung Cheong Ming wrote:
> 
> Hello everyone,
> 
> I just wonder if Mathematica can find the p-norms of a matrix?
> p can be 1, 2, infinity, though I know I can program those norms.
> 
> Joseph
> 
The infinity-norm is just the maximum over all rows of the sum of
absolute values. The 1-norm is the same, summed over columns.
Alternatively, it can be viewed as the infinity-norm of the transposed
matrix. The 2-norm is just the largest singular value.
The examples below were run in version 3 of mathematica, on a Pentium
Pro running under Linux.
In[1]:= normInfinity[m_] := Max[Apply[Plus, Abs[m], 1]]
In[2]:= norm1[m_] := normInfinity[Transpose[m]]
In[3]:= norm2[m_] := First[SingularValues[m][[2]]]
Let's try an example.
In[5]:= SeedRandom[1111]
In[6]:= mat = Table[Random[], {400}, {400}];
In[7]:= normInfinity[mat]
Out[7]= 216.233
In[8]:= norm1[mat]
Out[8]= 218.138
In[9]:= Timing[norm2[mat]]
Out[9]= {34.54 Second, 200.454}
Good so far, except that the 2-norm is time-consuming to compute. Below
is a faster way that tends to be quite accurate. We use the so-called
"power method" to find the largest eigenvalue of
mat.Transpose[Conjugate[mat]]. As this matrix is symmetric, its largest
eigenvalue is also its largest singular value. Moreover, this is just
the square of the largest singular value of mat.
In[10]:= estimateNorm2[mat_?MatrixQ]:= Module[
        {symmat=mat.Transpose[Conjugate[mat]], len=Length[mat],
prec=Precision[mat], x, y},
        y = Table[Random[Real, {1, 2}, prec+5], {len}];
        For [j=1, j<=5, j++,
                x = y;
                y = symmat.x;
                ];
        Sqrt[Apply[Plus, Map[Abs,y]] / Apply[Plus, Map[Abs,x]]]
        ]
In[11]:= Timing[estimateNorm2[mat]]
Out[11]= {13.11 Second, 200.454}           
It can be checked that most of the time to do this is in taking the dot
product. Which makes sense, because that operation is O(n^3) for an
n-by-n matrix, whereas the rest of the code is clearly O(n^2).
Daniel Lichtblau
Wolfram Research
danl at wolfram.com