/usr/share/doc/octave/octave.html/Zeros-Treatment.html is in octave-doc 4.2.2-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Zeros Treatment (GNU Octave)</title>
<meta name="description" content="Zeros Treatment (GNU Octave)">
<meta name="keywords" content="Zeros Treatment (GNU Octave)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Diagonal-and-Permutation-Matrices.html#Diagonal-and-Permutation-Matrices" rel="up" title="Diagonal and Permutation Matrices">
<link href="Sparse-Matrices.html#Sparse-Matrices" rel="next" title="Sparse Matrices">
<link href="Example-Code.html#Example-Code" rel="prev" title="Example Code">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">
</head>
<body lang="en">
<a name="Zeros-Treatment"></a>
<div class="header">
<p>
Previous: <a href="Example-Code.html#Example-Code" accesskey="p" rel="prev">Example Code</a>, Up: <a href="Diagonal-and-Permutation-Matrices.html#Diagonal-and-Permutation-Matrices" accesskey="u" rel="up">Diagonal and Permutation Matrices</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Differences-in-Treatment-of-Zero-Elements"></a>
<h3 class="section">21.5 Differences in Treatment of Zero Elements</h3>
<a name="index-matrix_002c-zero-elements"></a>
<p>Making diagonal and permutation matrices special matrix objects in their own
right and the consequent usage of smarter algorithms for certain operations
implies, as a side effect, small differences in treating zeros.
The contents of this section apply also to sparse matrices, discussed in
the following chapter. (see <a href="Sparse-Matrices.html#Sparse-Matrices">Sparse Matrices</a>)
</p>
<p>The IEEE floating point standard defines the result of the expressions
<code>0*Inf</code> and <code>0*NaN</code> as <code>NaN</code>. This is widely agreed to be a
good compromise. Numerical software dealing with structured and sparse
matrices (including Octave) however, almost always makes a distinction between
a "numerical zero" and an "assumed zero". A
"numerical zero" is a zero value occurring in a place where any
floating-point value could occur. It is normally stored somewhere in memory
as an explicit value. An "assumed zero", on the contrary, is a zero
matrix element implied by the matrix structure (diagonal, triangular) or a
sparsity pattern; its value is usually not stored explicitly anywhere, but is
implied by the underlying data structure.
</p>
<p>The primary distinction is that an assumed zero, when multiplied
by any number, or divided by any nonzero number,
yields <strong>always</strong> a zero, even when, e.g., multiplied by <code>Inf</code>
or divided by <code>NaN</code>.
The reason for this behavior is that the numerical multiplication is not
actually performed anywhere by the underlying algorithm; the result is
just assumed to be zero. Equivalently, one can say that the part of the
computation involving assumed zeros is performed symbolically, not numerically.
</p>
<p>This behavior not only facilitates the most straightforward and efficient
implementation of algorithms, but also preserves certain useful invariants,
like:
</p>
<ul>
<li> scalar * diagonal matrix is a diagonal matrix
</li><li> sparse matrix / scalar preserves the sparsity pattern
</li><li> permutation matrix * matrix is equivalent to permuting rows
</li></ul>
<p>all of these natural mathematical truths would be invalidated by treating
assumed zeros as numerical ones.
</p>
<p>Note that <small>MATLAB</small> does not strictly follow this principle and converts
assumed zeros to numerical zeros in certain cases, while not doing so in
other cases. As of today, there are no intentions to mimic such behavior
in Octave.
</p>
<p>Examples of effects of assumed zeros vs. numerical zeros:
</p>
<div class="example">
<pre class="example">Inf * eye (3)
⇒
Inf 0 0
0 Inf 0
0 0 Inf
Inf * speye (3)
⇒
Compressed Column Sparse (rows = 3, cols = 3, nnz = 3 [33%])
(1, 1) -> Inf
(2, 2) -> Inf
(3, 3) -> Inf
Inf * full (eye (3))
⇒
Inf NaN NaN
NaN Inf NaN
NaN NaN Inf
</pre></div>
<div class="example">
<pre class="example">diag (1:3) * [NaN; 1; 1]
⇒
NaN
2
3
sparse (1:3,1:3,1:3) * [NaN; 1; 1]
⇒
NaN
2
3
[1,0,0;0,2,0;0,0,3] * [NaN; 1; 1]
⇒
NaN
NaN
NaN
</pre></div>
<hr>
<div class="header">
<p>
Previous: <a href="Example-Code.html#Example-Code" accesskey="p" rel="prev">Example Code</a>, Up: <a href="Diagonal-and-Permutation-Matrices.html#Diagonal-and-Permutation-Matrices" accesskey="u" rel="up">Diagonal and Permutation Matrices</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|