Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse
- To: mathgroup at smc.vnet.net
- Subject: [mg123308] Re: gives different result compared to 1/Diagonal[Normal@A] when A is sparse
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Thu, 1 Dec 2011 05:50:22 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
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 > 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