[Date Index]
[Thread Index]
[Author Index]
Re: Re: Product command with matrices
*To*: mathgroup at smc.vnet.net
*Subject*: [mg87906] Re: [mg87889] Re: Product command with matrices
*From*: danl at wolfram.com
*Date*: Sat, 19 Apr 2008 23:50:41 -0400 (EDT)
*References*: <fu9ft7$ce2$1@smc.vnet.net> <fu9vr5$iim$1@smc.vnet.net>
> On Apr 18, 6:14 am, Jens-Peer Kuska <ku... at informatik.uni-leipzig.de>
> wrote:
>> Hi,
>>
>> Times[] is not Dot[] and Product[] and no equivalent to use
>> Dot[] instedad of Times[] and there is no (easy) way to
>> tell Mathematica that f[1] is a matrix and what may be A
>> a scalar ? a vector or a matrix too ? Even I can't find it out
>> and Mathematica can't know it.
>>
>> You mean
>>
>> DotProduct[mtx_, {i_, i1_, in_}] := Dot @@ Table[mtx, {i, i1, in}]
>>
>> Phi[0] := Id;
>> Phi[n_] := DotProduct[Id + f[i] ** A, {i, 0, n - 1}]
>>
>> and
>>
>> Phi[3] gives
>>
>> (Id + f[0] ** A).(Id + f[1] ** A).(Id + f[2] ** A)
>>
>> Regards
>> Jens
>>
>> J Davis wrote:
>> > I want to define a matrix valued function such as the following (in
>> > LaTeX lingo):
>>
>> > $$
>> > X(0)=Id,
>> > X(n)=\prod_{i=0}^{n-1} (Id + f[i] A)
>> > $$
>>
>> > where A and f have already been defined and Id is the identity matrix
>> > of appropriate size.
>>
>> > I tried the following:
>>
>> > Id=IdentityMatrix[2];
>> > Phi[0]:=Id;
>> > Phi[n_]:= Product[Id + f[i] A,{i,0,n-1}]
>>
>> > However, Phi[3] and (Id+f[2]A).(Id+f[1]A).(Id+f[0]A) do not agree.
>>
>> > Any help around this would be appreciated.
>
> Thanks very much to W Craig Carter (and others) who replied to me via
> email. I thought I would share the following very efficient solution:
>
> Phi[n_]:=Apply[Dot,Table[Id + f[k]A,{k,0,n-1}]]
There is a caveat to this approach. If your purpose is to do
matrix-times-vector products (this is quite common, say in iterative
linear solvers), then you'd want to avoid the explicit Dot expansion. That
is, instead of the matrix-times-matrix you would only do
matrix-times-vector. This will cut the run time by a factor approximating
the dimension. Here is an example, using integers just to show equivalence
(for numeric purposes, say, one would more likely have matrices of inexact
numbers).
f[j_] := 3*j^2 - j + 5
matfunc[m_, n_] := Table[IdentityMatrix[dim] + f[j]*m, {j, n}]
In[82]:= dim = 25;
n = 200;
bnd = 5;
mat = RandomInteger[{-bnd, bnd}, {dim, dim}];
vec = RandomInteger[{-bnd, bnd}, {dim}];
Now notice that creating the table is quick, and evaluating the
matrix-times-vector is nearly dim times slower than expanding the matrix
product explicitly followed by application to the vector (and they give
the same result).
In[87]:= Timing[mtable = matfunc[mat, n];]
Timing[prod = Apply[Dot, mtable];]
Timing[newvec = prod.vec;]
Timing[newvec2 = Fold[Dot[#2, #1] &, vec, Reverse[mtable]];]
Max[Abs[newvec - newvec2]]
Out[87]= {0.02, Null}
Out[88]= {3.785, Null}
Out[89]= {0., Null}
Out[90]= {0.171, Null}
Out[91]= 0
Daniel Lichtblau
Wolfram Research
Prev by Date:
**Re: axis alignment of 3D plots with ListContourPlot3D**
Next by Date:
**Re: Re: A kernel, multiple notebooks, and Global?**
Previous by thread:
**Re: Product command with matrices**
Next by thread:
**Scaling Plot inside Row**
| |