MathGroup Archive 1999

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

Search the Archive

Re: Packed Arrays in version 4

  • To: mathgroup at smc.vnet.net
  • Subject: [mg19082] Re: [mg18963] Packed Arrays in version 4
  • From: John Tanner <john at janacek.demon.co.uk>
  • Date: Thu, 5 Aug 1999 01:35:04 -0400
  • Organization: Peace with the World
  • References: <7o5fd0$rgp@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

In article <7o5fd0$rgp at smc.vnet.net>, Ersek, Ted R
<ErsekTR at navair.navy.mil> writes
 <Snip>
>---------------------------------------
>
>John,
>
>The following should do what you want for Times and you can make a similar
>definition for Transpose.  However, I don't recommend it because it will
>slow done Times in every case when this rule isn't used.
>
>
>In[1]:=
>HiddenSymbols`ModifyTimes=True;
>Unprotect[Times];
>
>Times[z_Complex,arr_?Developer`PackedArrayQ]/;
>  HiddenSymbols`ModifyTimes:=
>    Block[{HiddenSymbols`ModifyTimes},
>      Developer`ToPackedArray[Times[z,arr]]
>    ];
>
>Protect[Times];
>
>------------------
>How does it work?
>
>The above definition is only used when 
>(HiddenSymbols`ModifyTimes=True).  When the rule is used Block
>temporarily clears the value of (HiddenSymbols`ModifyTimes), so
>the kernel doesn't go back and use the rule again.
>
>
>Regards,
>Ted Ersek
>

Thank you, Ted: this is a good solution for Transpose (see also my reply
to Bruno Daniel).  Just by replacing Transpose for Times everywhere (and
a little mixing of arguments) gave a good result.

However I still have great difficulty with Times: I cannot make your
function above give satisfactory results.   I give an example below, it
actually seems to be counter-productive.  Is this because Transpose does
not have Listable (etc.) Attributes like Times?

It has been suggested to me by e-mail that using (N[I]*array) instead of
(I*array) solves the problem, and indeed I had found that
((I+0.0)*array) also solved the problem.  The real problem is that
multiplying a real array by I is so common in electronics/microwaves!  I
have many, many notebooks with many,many,many occurrences of this and I
do not want to start chasing them all down.  Thus I have a real
motivation for making this work as a redefinition of Times or
\[ImaginaryI].  A global redefinition of Global`I := N[System`I] (see my
reply to Bruno Daniel) is probably extremely risky!

***********example***************
In[1]:=
avbytesize[arr_] := ByteCount[arr]/Length[Flatten[{arr}]] // N

In[2]:=
tmp1 = Table[Random[], {100000}];
tmp2 = Developer`FromPackedArray[tmp1];

In[4]:=
{avbytesize[#], Developer`PackedArrayQ[#]} & /@ 
  {tmp1, tmp2,
   Times[tmp1, tmp1], tmp1*tmp2,
   I*tmp1, N[I]*tmp1,
   I*tmp2, N[I]*tmp2}

Out[4]=
{{8.00056, True}, {20.0002, False},
 {8.00056, True}, {8.00056, True},
 {60.0002, False}, {16.0006, True},
 {60.0002, False}, {16.0006, True}}

*********************************

but I dont understand what happens after evaluating your function,
especially mystifying since the results for Transpose were so good:

*********************************
In[5]:=
HiddenSymbols`ModifyTimes = True;
Unprotect[Times];
Times[z_Complex, arr_?Developer`PackedArrayQ] /;
HiddenSymbols`ModifyTimes := 
    Block[{HiddenSymbols`ModifyTimes}, 
      Developer`ToPackedArray[Times[z, arr]]];
Protect[Times];

In[9]:=
{avbytesize[#], Developer`PackedArrayQ[#]} & /@ 
{tmp1, tmp2, 
 Times[tmp1, tmp1], tmp1*tmp2,
 I*tmp1, N[I]*tmp1,
 I*tmp2, N[I]*tmp2}

Out[9]=
{{8.00056, True}, {20.0002, False},
 {20.0002, False}, {20.0002, False},
 {60.0002, False}, {60.0002, False},
 {60.0002, False}, {60.0002, False}}
-- 
  from -   John Tanner                 home -  john at janacek.demon.co.uk
  mantra - curse Microsoft, curse...   work -  john.tanner at gecm.com
I hate this 'orrible computer,  I really ought to sell it:
It never does what I want,      but only what I tell it.



  • Prev by Date: Re: Biased Random[Integer]?
  • Next by Date: Re: Lists to mask other lists
  • Previous by thread: Re: Packed Arrays in version 4
  • Next by thread: RE: Re: Packed Arrays in version 4