MathGroup Archive 2011

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

Search the Archive

Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse

  • To: mathgroup at smc.vnet.net
  • Subject: [mg123310] Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse
  • From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
  • Date: Thu, 1 Dec 2011 05:50:47 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

On Wed, 30 Nov 2011, Daniel Lichtblau wrote:

> On 11/30/2011 06:50 AM, Oliver Ruebenkoenig wrote:
>> I filed this as a bug.
>> 
>> One small side note: You might want to use
>> 
>> A[[r, r + 1]] = 0.;
>> A[[r + 1, r]] = 0.;
>> 
>> instead of A[[..]]=0.&  /@ r. Extraction/Setting of SA componets is
>> vectoriezed.
>> 
>> Oliver
>
> I'm not sure this is a bug (he said, disagreeably).
>
> Diagonal returns a SparseArray and preserves the implicit element value 
> (which in this case is zero). So inverting that new SparseArray gives 
> ComplexInfinity for the implicit value. Even though that value is not needed 
> because all entries are given explicitly.
>
> The SparseArray result does in fact have .25 for the actual values.
>
> Daniel Lichtblau
> Wolfram Research
>

Right. I had a discussion with a colleague and in principal I belive this 
is fixable (the message), but the impact this is going to have on 
performance is not going to justify that fix.

Oliver

>
>> On Wed, 30 Nov 2011, Nasser M. Abbasi wrote:
>> 
>>> I found this strange behavior, and I do not think it is correct.
>>> 
>>> This is version 8.04.
>>> 
>>> 1/Diagonal[A]  gives a divide by zero error, but 1/Diagonal[Normal@A] does
>>> not. This is when A is sparse.
>>> 
>>> ------------------------------
>>> Clear["Global`*"]
>>> 
>>> makeMatrix[n_]:=Module[{numberOfUnknowns=n^2,r,A},
>>> 
>>> A=SparseArray[
>>> {
>>>   Band[{1,1}]->4.0,
>>>   Band[{2,1}]->-1,
>>>   Band[{1,2}]->-1,
>>>   Band[{1,n+1}]->-1,
>>>   Band[{n+1,1}]->-1
>>> },{numberOfUnknowns,numberOfUnknowns},0.
>>> ];
>>> 
>>> r=Range[n,n^2-n,n];
>>> (A[[#,#+1]]=0.)&/@r;
>>> (A[[#+1,#]]=0.)&/@r;
>>> 
>>> A
>>> ];
>>> 
>>> (A = makeMatrix[3])//MatrixForm
>>> 
>>> (Diagonal[A])//Normal
>>> 
>>> 1/Diagonal[Normal@A]  (* ===>  OK *)
>>> 1/Diagonal[A]         (* error *)
>>> 
>>> ----------------------------------------
>>> 
>>> So, 1/Diagonal[Normal@A]  gives
>>> {0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25}
>>> 
>>> but 1/Diagonal[A]  gives 1/0
>>> 
>>> In another system I use, both operations give
>>> {0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25}
>>> 
>>> i.e. if the matrix is sparse or not, 1/Diagonal[A] should work
>>> regardless.  I think sparse matrices need to be more integrated into
>>> all Mathemaitca matrix operations.
>>> 
>>> Or Am I missing something here?
>>> 
>>> Thanks,
>>> --Nasser
>
>
>



  • Prev by Date: Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse
  • Next by Date: Re: RE: Re: How to simplify ArcSin formula
  • Previous by thread: Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse
  • Next by thread: Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse