File: Expressions-Involving-Diagonal-Matrices.html

package info (click to toggle)
octave 10.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 145,388 kB
  • sloc: cpp: 335,976; ansic: 82,241; fortran: 20,963; objc: 9,402; sh: 8,756; yacc: 4,392; lex: 4,333; perl: 1,544; java: 1,366; awk: 1,259; makefile: 660; xml: 192
file content (140 lines) | stat: -rw-r--r-- 6,833 bytes parent folder | download
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
<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Expressions Involving Diagonal Matrices (GNU Octave (version 10.3.0))</title>

<meta name="description" content="Expressions Involving Diagonal Matrices (GNU Octave (version 10.3.0))">
<meta name="keywords" content="Expressions Involving Diagonal Matrices (GNU Octave (version 10.3.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">

<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Matrix-Algebra.html" rel="up" title="Matrix Algebra">
<link href="Expressions-Involving-Permutation-Matrices.html" rel="next" title="Expressions Involving Permutation Matrices">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">


</head>

<body lang="en">
<div class="subsection-level-extent" id="Expressions-Involving-Diagonal-Matrices">
<div class="nav-panel">
<p>
Next: <a href="Expressions-Involving-Permutation-Matrices.html" accesskey="n" rel="next">Expressions Involving Permutation Matrices</a>, Up: <a href="Matrix-Algebra.html" accesskey="u" rel="up">Linear Algebra with Diagonal/Permutation Matrices</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="Expressions-Involving-Diagonal-Matrices-1"><span>21.2.1 Expressions Involving Diagonal Matrices<a class="copiable-link" href="#Expressions-Involving-Diagonal-Matrices-1"> &para;</a></span></h4>
<a class="index-entry-id" id="index-diagonal-matrix-expressions"></a>

<p>Assume <var class="var">D</var> is a diagonal matrix.  If <var class="var">M</var> is a full matrix,
then <code class="code">D*M</code> will scale the rows of <var class="var">M</var>.  That means,
if <code class="code">S = D*M</code>, then for each pair of indices
i,j it holds
</p>
<div class="example">
<pre class="example-preformatted">S(i,j) = D(i,i) * M(i,j).
</pre></div>

<p>Similarly, <code class="code">M*D</code> will do a column scaling.
</p>
<p>The matrix <var class="var">D</var> may also be rectangular, m-by-n where <code class="code">m != n</code>.
If <code class="code">m &lt; n</code>, then the expression <code class="code">D*M</code> is equivalent to
</p>
<div class="example">
<pre class="example-preformatted">D(:,1:m) * M(1:m,:),
</pre></div>

<p>i.e., trailing <code class="code">n-m</code> rows of <var class="var">M</var> are ignored.  If <code class="code">m &gt; n</code>,
then <code class="code">D*M</code> is equivalent to
</p>
<div class="example">
<pre class="example-preformatted">[D(1:n,:) * M; zeros(m-n, columns (M))],
</pre></div>

<p>i.e., null rows are appended to the result.
The situation for right-multiplication <code class="code">M*D</code> is analogous.
</p>
<a class="index-entry-id" id="index-pseudoinverse-1"></a>
<p>The expressions <code class="code">D \ M</code> and <code class="code">M / D</code> perform inverse scaling.
They are equivalent to solving a diagonal (or rectangular diagonal)
in a least-squares minimum-norm sense.  In exact arithmetic, this is
equivalent to multiplying by a pseudoinverse.  The pseudoinverse of
a rectangular diagonal matrix is again a rectangular diagonal matrix
with swapped dimensions, where each nonzero diagonal element is replaced
by its reciprocal.
The matrix division algorithms do, in fact, use division rather than
multiplication by reciprocals for better numerical accuracy; otherwise, they
honor the above definition.  Note that a diagonal matrix is never truncated due
to ill-conditioning; otherwise, it would not be of much use for scaling.  This
is typically consistent with linear algebra needs.  A full matrix that only
happens to be diagonal (and is thus not a special object) is of course treated
normally.
</p>
<p>Multiplication and division by diagonal matrices work efficiently also when
combined with sparse matrices, i.e., <code class="code">D*S</code>, where <var class="var">D</var> is a diagonal
matrix and <var class="var">S</var> is a sparse matrix scales the rows of the sparse matrix and
returns a sparse matrix.  The expressions <code class="code">S*D</code>, <code class="code">D\S</code>, <code class="code">S/D</code>
work analogically.
</p>
<p>If <var class="var">D1</var> and <var class="var">D2</var> are both diagonal matrices, then the expressions
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">D1 + D2
D1 - D2
D1 * D2
D1 / D2
D1 \ D2
</pre></div></div>

<p>again produce diagonal matrices, provided that normal
dimension matching rules are obeyed.  The relations used are same as described
above.
</p>
<p>Also, a diagonal matrix <var class="var">D</var> can be multiplied or divided by a scalar, or
raised to a scalar power if it is square, producing diagonal matrix result in
all cases.
</p>
<p>A diagonal matrix can also be transposed or conjugate-transposed, giving the
expected result.  Extracting a leading submatrix of a diagonal matrix, i.e.,
<code class="code">D(1:m,1:n)</code>, will produce a diagonal matrix, other indexing expressions
will implicitly convert to full matrix.
</p>
<p>Adding a diagonal matrix to a full matrix only operates on the diagonal
elements.  Thus,
</p>
<div class="example">
<pre class="example-preformatted">A = A + eps * eye (n)
</pre></div>

<p>is an efficient method of augmenting the diagonal of a matrix.  Subtraction
works analogically.
</p>
<p>When involved in expressions with other element-by-element operators,
<code class="code">.*</code>, <code class="code">./</code>, <code class="code">.\</code> or <code class="code">.^</code>, an implicit conversion to full
matrix will take place.  This is not always strictly necessary but chosen to
facilitate better consistency with <small class="sc">MATLAB</small>.
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Expressions-Involving-Permutation-Matrices.html">Expressions Involving Permutation Matrices</a>, Up: <a href="Matrix-Algebra.html">Linear Algebra with Diagonal/Permutation Matrices</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>