MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Matrices & Compile

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22575] Re: [mg22525] Matrices & Compile
  • From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
  • Date: Sat, 11 Mar 2000 17:52:46 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

on 3/9/00 9:24 AM, Kurt Taretto at Kurt.Taretto at ipe.uni-stuttgart.de wrote:

> 
> Hi,
> 
> I'm making some functions using Compile, but I found some features of
> Compile which I don't fully
> understand yet.  The following trivial function should take an nxn
> matrix and asign the value 1.0
> to the element (2,2) of that matrix:
> 
> In[1]:=
> f = Compile[{{n, _Integer}, {a, _Real, 2}}, a[[2, 2]] = 1.0]
> 
> Out[1]=
> CompiledFunction[{n, a}, a[[2, 2]] = 1., "-CompiledCode-"]
> 
> 
> The compilation was succesfull, but the function does not work:
> 
> In[2]:=
> a = {{3, 2}, {1, 4}};
> 
> In[3]:=
> f[2, a]
> 
> Set::"setps": {{3, 2}, {1, 4}}; in assignment of part is not a symbol."
> 
> Out[3]=
> 1.
> 
> In[4]:=
> a
> 
> Out[4]=
> {{3, 2}, {1, 4}}
> 
> If I assign matrix a to an object b, everything goes well
> 
> In[5]:=
> f = Compile[{{n, _Integer}, {a, _Real, 2}},
> Module[{b}, b = a; b[[2, 2]] = 1; b]]
> 
> Out[5]=
> CompiledFunction[{n, a},
> Module[{b}, b = a; b[[2, 2]]= 1;b], "-CompiledCode-"]
> 
> In[6]:=
> a = f[2, a]
> 
> Out[6]=
> {{3., 2.}, {1., 1.}}
> 
> The problem with this alternative is the unecessary memory requirement
> for b, and also the
> need for extra notation.  I'm dealing with functions that take several
> large matrices as arguments,
> and do operations on their elements.  Making statements like the above
> "b=a" makes the resulting code
> unnecesary complicated and more difficult to read.  Is there any way out
> of this or did I make some
> simple mistake?
> 
> Any help will be appreciated!  Thanks!
> 
> Kurt Taretto
> 
> 
> 

The reason why your construction does not work is that Compile works just
like Function, in other when you call f[x,y], n and a in the body of your
function definition are literarly replaced by x and y. One possible way to
get round this is to use ReplacePart instead of Part in the body of Compile:

In[1]:=
f = Compile[{{n, _Integer}, {a, _Real, 2}}, ReplacePart[a, 1.0, {2, 2}]];
In[2]:=
a = {{3, 2}, {1, 4}};
In[3]:=
f[2, a]
Out[3]=
{{3., 2.}, {1., 1.}}


-- 
Andrzej Kozlowski
Toyama International University
JAPAN
http://sigma.tuins.ac.jp




  • Prev by Date: Re: Matrices & Compile
  • Next by Date: Re: iterations, recursions and derivatives
  • Previous by thread: Re: Matrices & Compile
  • Next by thread: publishing with mathematica