<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif; ">
<div>Walter/Dennis</div>
<div><br>
</div>
<div>I just had another look at your post, and the inverse_matrix() documentation. It looks like inverse_matrix() gives the same error codes as solve_linsys(), and you'd actually reported them. Sorry for leading you up the garden path.</div>
<div><br>
</div>
<div>Anyway, it does like like you have a singular (non-invertible) matrix.</div>
<div><br>
</div>
<div>If you have a dig through some of the linear algebra literature there are a number of ways that you can alter a matrix, but that's definitely beyond the remit of ncl-talk.</div>
<div><br>
</div>
<div>Will</div>
<div><br>
</div>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Walter Hannah &lt;<a href="mailto:whannah@atmos.colostate.edu">whannah@atmos.colostate.edu</a>&gt;<br>
<span style="font-weight:bold">Date: </span>Tuesday, 11 November 2014 10:25 AM<br>
<span style="font-weight:bold">To: </span>Will Hobbs &lt;<a href="mailto:will.hobbs@utas.edu.au">will.hobbs@utas.edu.au</a>&gt;, Dennis Shea &lt;<a href="mailto:shea@ucar.edu">shea@ucar.edu</a>&gt;<br>
<span style="font-weight:bold">Cc: </span>&quot;<a href="mailto:ncl-talk@ucar.edu">ncl-talk@ucar.edu</a>&quot; &lt;<a href="mailto:ncl-talk@ucar.edu">ncl-talk@ucar.edu</a>&gt;<br>
<span style="font-weight:bold">Subject: </span>Re: [ncl-talk] inverse_matrix problem<br>
</div>
<div><br>
</div>
<div>
<div bgcolor="#FFFFFF" text="#000000">Will,<br>
<br>
I tried your suggestion, but all I got back was missing values.<br>
<br>
After Dennis's suggestion, I tried replacing the zeros with tiny random numbers, using this code:<br>
<blockquote><tt>R = random_normal( 0.,1e-12, (/nlev*2,nlev*2/))</tt><tt><br>
</tt><tt>M = where(M.eq.0,R,M)</tt><tt><br>
</tt><tt>iM = inverse_matrix(M)</tt><br>
</blockquote>
Interestingly, this worked perfectly, and I got what I expected.<br>
I also tried using this approach to trying Will's suggestion, and that also worked with the random numbers!<br>
<br>
I can't figure out a mathematical explanation, but this seems like a pretty nice fix. Might be good to add this to the online documentation.<br>
<br>
Thanks,<br>
Walter<br>
<br>
<div class="moz-cite-prefix">On 11/10/14 6:17 PM, Will Hobbs wrote:<br>
</div>
<blockquote cite="mid:D0879173.90CA%25will.hobbs@utas.edu.au" type="cite">
<div>Walter</div>
<div><br>
</div>
<div>Instead of using the inverse matrix() function, try using solve_linsys(A, B) instead, for A = &nbsp;your matrix and B = I (the identity matrix). Since A * inv(A) = I, the output will be the inverse.</div>
<div><br>
</div>
<div>Mathematically this is no different to inverse_matrix(), but the code is a little different. In particular, if the matrix is singular (i.e. the determinant = 0, and it cannot be inverted) then it will return an error code.</div>
<div><a moz-do-not-send="true" href="https://www.ncl.ucar.edu/Document/Functions/Built-in/solve_linsys.shtml">https://www.ncl.ucar.edu/Document/Functions/Built-in/solve_linsys.shtml</a></div>
<div><br>
</div>
<div>This might help you figure out if the matrix itself is the problem (I suspect, as Dennis has suggested, that may be the issue).</div>
<div><br>
</div>
<div>Will</div>
<div><br>
</div>
<div><br>
</div>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:11pt;
          text-align:left; color:black; BORDER-BOTTOM: medium none;
          BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT:
          0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid;
          BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Walter Hannah &lt;<a moz-do-not-send="true" href="mailto:whannah@atmos.colostate.edu">whannah@atmos.colostate.edu</a>&gt;<br>
<span style="font-weight:bold">Date: </span>Tuesday, 11 November 2014 9:52 AM<br>
<span style="font-weight:bold">To: </span>Dennis Shea &lt;<a moz-do-not-send="true" href="mailto:shea@ucar.edu">shea@ucar.edu</a>&gt;<br>
<span style="font-weight:bold">Cc: </span>&quot;<a moz-do-not-send="true" href="mailto:ncl-talk@ucar.edu">ncl-talk@ucar.edu</a>&quot; &lt;<a moz-do-not-send="true" href="mailto:ncl-talk@ucar.edu">ncl-talk@ucar.edu</a>&gt;<br>
<span style="font-weight:bold">Subject: </span>Re: [ncl-talk] inverse_matrix problem<br>
</div>
<div><br>
</div>
<div>
<div bgcolor="#FFFFFF" text="#000000">Dennis,<br>
<br>
Wow! Thanks for going above and beyond! This helps a lot. I'll try to look for a way to get a modified matrix that doesn't have all those zeros.<br>
<br>
Walter<br>
<br>
<div class="moz-cite-prefix">On 11/10/14 5:50 PM, Dennis Shea wrote:<br>
</div>
<blockquote cite="mid:CAOF1d_7VTz2TU8BRDMqZFrD4r=w0_E&#43;gbnXHWbUC2YNvQuA3hQ@mail.gmail.com" type="cite">
<div dir="ltr">
<div>
<div>
<div>You have rows of 0.0 ... I think that is causing issues. I'm sure some 'math-whiz' could answer but I attached a simple test code that reads your data (thx for providing). It calculates the inverse and the identity matrix. Note that NCL is using a direct
 call to the documented LAPACK routines.<br>
<br>
===<br>
</div>
TEST1: duplicates your findings<br>
<br>
</div>
TEST 2: create a bogus 20x20 array of random numbers. No row consists of all constants. Identity matrix is successfully calculated.<br>
<br>
</div>
TEST 3: wherever the original array had a row of all 0.0, substitute random numbers. The identity matrix is successfully calculated.</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Nov 10, 2014 at 1:57 PM, Walter Hannah <span dir="ltr">
&lt;<a moz-do-not-send="true" href="mailto:whannah@atmos.colostate.edu" target="_blank">whannah@atmos.colostate.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
                    .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">Hi,<br>
<br>
I'm trying to use the &quot;inverse_matrix&quot; function. The matrix doesn't have any missing values, but I still get this error message:<br>
<blockquote><tt>Variable: M</tt><tt><br>
</tt><tt>Type: float</tt><tt><br>
</tt><tt>Total Size: 1600 bytes</tt><tt><br>
</tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 400 values</tt><tt><br>
</tt><tt>Number of Dimensions: 2</tt><tt><br>
</tt><tt>Dimensions and sizes:&nbsp;&nbsp;&nbsp; [pertlev | 20] x [tendlev | 20]</tt><tt><br>
</tt><tt>Coordinates:</tt><tt><br>
</tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pertlev: [50..1950]</tt><tt><br>
</tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tendlev: [50..1950]</tt><tt><br>
</tt><tt>Number Of Attributes: 2</tt><tt><br>
</tt><tt>&nbsp; missing_value :&nbsp;&nbsp;&nbsp; 9.96921e&#43;36</tt><tt><br>
</tt><tt>&nbsp; _FillValue :&nbsp;&nbsp;&nbsp; 9.96921e&#43;36</tt><tt><br>
</tt><tt>(0)&nbsp;&nbsp;&nbsp; ----------------------------------------------------------------------------</tt><tt><br>
</tt><tt><br>
</tt><tt>&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00<br>
&nbsp;&nbsp; 0.00&nbsp; -0.31&nbsp; -0.06&nbsp;&nbsp; 0.15&nbsp; -0.27&nbsp; -0.56&nbsp; -1.21&nbsp; -1.38&nbsp; -1.36&nbsp;&nbsp; 1.49&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 4.65&nbsp;&nbsp; 0.37&nbsp;&nbsp; 0.46&nbsp;&nbsp; 0.47&nbsp;&nbsp; 0.52&nbsp;&nbsp; 0.55&nbsp;&nbsp; 0.77&nbsp;&nbsp; 2.49<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.26&nbsp; -0.35&nbsp; -0.29&nbsp; -0.65&nbsp; -1.13&nbsp; -2.24&nbsp; -2.45&nbsp; -2.47&nbsp;&nbsp; 2.91&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 4.07&nbsp;&nbsp; 2.45&nbsp;&nbsp; 0.95&nbsp;&nbsp; 0.87&nbsp;&nbsp; 0.90&nbsp;&nbsp; 1.05&nbsp;&nbsp; 1.55&nbsp;&nbsp; 4.81<br>
&nbsp;&nbsp; 0.00&nbsp; -0.11&nbsp;&nbsp; 1.43&nbsp; -0.91&nbsp; -1.69&nbsp; -1.52&nbsp; -2.63&nbsp; -2.81&nbsp; -2.69&nbsp;&nbsp; 3.17&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -2.35&nbsp;&nbsp; 2.61&nbsp;&nbsp; 1.49&nbsp;&nbsp; 1.01&nbsp;&nbsp; 1.00&nbsp;&nbsp; 1.18&nbsp;&nbsp; 1.78&nbsp;&nbsp; 5.32<br>
&nbsp;&nbsp; 0.00&nbsp; -0.02&nbsp;&nbsp; 0.55&nbsp;&nbsp; 1.08&nbsp; -1.74&nbsp; -2.04&nbsp; -2.59&nbsp; -2.71&nbsp; -2.39&nbsp;&nbsp; 2.63&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -0.75&nbsp; -1.10&nbsp;&nbsp; 1.35&nbsp;&nbsp; 1.02&nbsp;&nbsp; 0.89&nbsp;&nbsp; 1.00&nbsp;&nbsp; 1.57&nbsp;&nbsp; 4.87<br>
&nbsp;&nbsp; 0.00&nbsp; -0.06&nbsp;&nbsp; 0.16&nbsp;&nbsp; 0.52&nbsp;&nbsp; 0.72&nbsp; -1.86&nbsp; -2.88&nbsp; -2.74&nbsp; -2.29&nbsp;&nbsp; 2.31&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.31&nbsp; -1.30&nbsp; -0.26&nbsp;&nbsp; 0.87&nbsp;&nbsp; 0.75&nbsp;&nbsp; 0.82&nbsp;&nbsp; 1.27&nbsp;&nbsp; 4.50<br>
&nbsp;&nbsp; 0.00&nbsp; -0.13&nbsp; -0.07&nbsp;&nbsp; 0.20&nbsp;&nbsp; 0.54&nbsp;&nbsp; 0.27&nbsp; -2.74&nbsp; -3.10&nbsp; -2.27&nbsp;&nbsp; 2.04&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.08&nbsp; -0.49&nbsp; -0.47&nbsp;&nbsp; 0.14&nbsp;&nbsp; 0.72&nbsp;&nbsp; 0.69&nbsp;&nbsp; 1.13&nbsp;&nbsp; 4.24<br>
&nbsp;&nbsp; 0.00&nbsp; -0.15&nbsp; -0.06&nbsp;&nbsp; 0.20&nbsp; -0.17&nbsp;&nbsp; 0.02&nbsp; -0.77&nbsp; -3.87&nbsp; -3.13&nbsp;&nbsp; 2.39&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.69&nbsp; -0.08&nbsp;&nbsp; 0.09&nbsp;&nbsp; 0.03&nbsp;&nbsp; 0.36&nbsp;&nbsp; 0.90&nbsp;&nbsp; 1.29&nbsp;&nbsp; 4.59<br>
&nbsp;&nbsp; 0.00&nbsp; -0.14&nbsp;&nbsp; 0.05&nbsp;&nbsp; 0.09&nbsp; -0.17&nbsp; -0.29&nbsp; -0.14&nbsp; -0.66&nbsp; -5.36&nbsp;&nbsp; 2.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.39&nbsp;&nbsp; 0.17&nbsp;&nbsp; 0.14&nbsp;&nbsp; 0.07&nbsp; -0.01&nbsp;&nbsp; 0.22&nbsp;&nbsp; 1.00&nbsp;&nbsp; 4.05<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.02&nbsp; -0.07&nbsp; -0.01&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.43&nbsp;&nbsp; 0.94&nbsp;&nbsp; 0.77&nbsp; -2.90&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -0.09&nbsp;&nbsp; 0.09&nbsp; -0.04&nbsp; -0.07&nbsp; -0.17&nbsp; -0.26&nbsp; -0.49&nbsp;&nbsp; 0.54<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00<br>
&nbsp;&nbsp; 0.00&nbsp; -0.01&nbsp; -0.04&nbsp;&nbsp; 0.12&nbsp; -0.02&nbsp; -0.01&nbsp; -0.03&nbsp; -0.05&nbsp; -0.05&nbsp;&nbsp; 0.04&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -2.17&nbsp; -0.25&nbsp; -0.14&nbsp;&nbsp; 0.01&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.12<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -0.19&nbsp;&nbsp; 0.11&nbsp;&nbsp; 0.28&nbsp;&nbsp; 0.06&nbsp;&nbsp; 0.11&nbsp;&nbsp; 0.06&nbsp;&nbsp; 0.07&nbsp; -0.13&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 2.75&nbsp; -1.97&nbsp; -0.04&nbsp; -0.12&nbsp; -0.05&nbsp; -0.05&nbsp; -0.08&nbsp; -0.10<br>
&nbsp;&nbsp; 0.00&nbsp; -0.02&nbsp; -0.14&nbsp; -0.08&nbsp;&nbsp; 0.31&nbsp;&nbsp; 0.21&nbsp;&nbsp; 0.13&nbsp;&nbsp; 0.08&nbsp;&nbsp; 0.06&nbsp; -0.08&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.48&nbsp;&nbsp; 1.11&nbsp; -1.09&nbsp; -0.13&nbsp; -0.10&nbsp; -0.06&nbsp; -0.09&nbsp; -0.12<br>
&nbsp;&nbsp; 0.00&nbsp; -0.01&nbsp; -0.03&nbsp; -0.11&nbsp; -0.07&nbsp;&nbsp; 0.32&nbsp;&nbsp; 0.27&nbsp;&nbsp; 0.12&nbsp;&nbsp; 0.18&nbsp; -0.17&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.63&nbsp;&nbsp; 0.52&nbsp; -0.94&nbsp; -0.02&nbsp; -0.15&nbsp; -0.08&nbsp; -0.25<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.02&nbsp;&nbsp; 0.08&nbsp; -0.06&nbsp; -0.24&nbsp;&nbsp; 0.10&nbsp;&nbsp; 0.43&nbsp;&nbsp; 0.26&nbsp;&nbsp; 0.16&nbsp; -0.17&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.07&nbsp;&nbsp; 0.31&nbsp;&nbsp; 0.35&nbsp;&nbsp; 0.40&nbsp; -1.06&nbsp; -0.06&nbsp; -0.20&nbsp; -0.26<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.06&nbsp;&nbsp; 0.03&nbsp; -0.10&nbsp;&nbsp; 0.07&nbsp;&nbsp; 0.11&nbsp;&nbsp; 1.03&nbsp;&nbsp; 1.38&nbsp;&nbsp; 0.53&nbsp; -1.10&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -0.44&nbsp;&nbsp; 0.14&nbsp; -0.03&nbsp;&nbsp; 0.08&nbsp;&nbsp; 0.19&nbsp; -1.61&nbsp; -0.76&nbsp; -1.16<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.11&nbsp; -0.03&nbsp; -0.08&nbsp;&nbsp; 0.07&nbsp;&nbsp; 0.16&nbsp;&nbsp; 0.46&nbsp;&nbsp; 1.28&nbsp;&nbsp; 1.65&nbsp; -1.21&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -0.25&nbsp;&nbsp; 0.07&nbsp; -0.06&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.14&nbsp;&nbsp; 0.41&nbsp; -3.04&nbsp; -0.66<br>
&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.12&nbsp; -0.30&nbsp; -0.15&nbsp;&nbsp; 0.80&nbsp;&nbsp; 1.58&nbsp;&nbsp; 2.86&nbsp;&nbsp; 3.62&nbsp;&nbsp; 5.02&nbsp; -3.15&nbsp;&nbsp; 0.00&nbsp;&nbsp; 0.00&nbsp; -1.23&nbsp; -0.91&nbsp; -0.80&nbsp; -0.94&nbsp; -0.85&nbsp; -0.66&nbsp;&nbsp; 0.21 -10.64<br>
<br>
(0)&nbsp;&nbsp;&nbsp; ----------------------------------------------------------------------------<br>
(0)&nbsp;&nbsp;&nbsp; # missing values: 0<br>
(0)&nbsp;&nbsp;&nbsp; # values = 0.0&nbsp; : 111</tt><tt><br>
</tt><tt>warning:inverse_matrix: info = 1; missing values not allowed</tt><br>
</blockquote>
<br>
I thought it might have something to do with those zero values, but if I replace them with non-zero values I get a similar, but not identical, result:<br>
<blockquote><tt>...<br>
(0)&nbsp;&nbsp;&nbsp; ----------------------------------------------------------------------------</tt><tt><br>
</tt><tt>(0)&nbsp;&nbsp;&nbsp; # missing values: 0</tt><tt><br>
</tt><tt>(0)&nbsp;&nbsp;&nbsp; # values = 0.0&nbsp; : 0</tt><tt><br>
</tt><tt>warning:inverse_matrix: info = 20; missing values not allowed</tt><br>
</blockquote>
<br>
<br>
Thanks,<br>
Walter </div>
<br>
_______________________________________________<br>
ncl-talk mailing list<br>
List instructions, subscriber options, unsubscribe:<br>
<a moz-do-not-send="true" href="http://mailman.ucar.edu/mailman/listinfo/ncl-talk" target="_blank">http://mailman.ucar.edu/mailman/listinfo/ncl-talk</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</div>
</div>
</span></blockquote>
<br>
</div>
</div>
</span>
</body>
</html>