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