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
>
>
>