annotate doc/interpreter/sparse.txi @ 7007:6304d9ea0a30

[project @ 2007-10-11 16:26:36 by jwe]
author jwe
date Thu, 11 Oct 2007 16:26:37 +0000
parents 8b0cfeb06365
children fd42779a8428
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
1 @c Copyright (C) 2004, 2005 David Bateman
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
2 @c This is part of the Octave manual.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
3 @c For copying conditions, see the file gpl.texi.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
4
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
5 @ifhtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
6 @set htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
7 @end ifhtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
8 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
9 @set htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
10 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
11
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
12 @node Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
13 @chapter Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
14
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
15 @menu
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
16 * Basics:: The Creation and Manipulation of Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
17 * Sparse Linear Algebra:: Linear Algebra on Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
18 * Iterative Techniques:: Iterative Techniques applied to Sparse Matrices
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
19 * Real Life Example:: Real Life Example of the use of Sparse Matrices
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
20 @end menu
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
21
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
22 @node Basics, Sparse Linear Algebra, Sparse Matrices, Sparse Matrices
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
23 @section The Creation and Manipulation of Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
24
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
25 The size of mathematical problems that can be treated at any particular
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
26 time is generally limited by the available computing resources. Both,
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
27 the speed of the computer and its available memory place limitation on
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
28 the problem size.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
29
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
30 There are many classes of mathematical problems which give rise to
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
31 matrices, where a large number of the elements are zero. In this case
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
32 it makes sense to have a special matrix type to handle this class of
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
33 problems where only the non-zero elements of the matrix are
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
34 stored. Not only does this reduce the amount of memory to store the
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
35 matrix, but it also means that operations on this type of matrix can
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
36 take advantage of the a-priori knowledge of the positions of the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
37 non-zero elements to accelerate their calculations.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
38
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
39 A matrix type that stores only the non-zero elements is generally called
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
40 sparse. It is the purpose of this document to discuss the basics of the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
41 storage and creation of sparse matrices and the fundamental operations
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
42 on them.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
43
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
44 @menu
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
45 * Storage:: Storage of Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
46 * Creation:: Creating Sparse Matrices
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
47 * Information:: Finding out Information about Sparse Matrices
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
48 * Operators and Functions:: Basic Operators and Functions on Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
49 @end menu
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
50
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
51 @node Storage, Creation, Basics, Basics
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
52 @subsection Storage of Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
53
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
54 It is not strictly speaking necessary for the user to understand how
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
55 sparse matrices are stored. However, such an understanding will help
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
56 to get an understanding of the size of sparse matrices. Understanding
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
57 the storage technique is also necessary for those users wishing to
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
58 create their own oct-files.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
59
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
60 There are many different means of storing sparse matrix data. What all
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
61 of the methods have in common is that they attempt to reduce the complexity
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
62 and storage given a-priori knowledge of the particular class of problems
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
63 that will be solved. A good summary of the available techniques for storing
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
64 sparse matrix is given by Saad @footnote{Youcef Saad "SPARSKIT: A basic toolkit
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
65 for sparse matrix computation", 1994,
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
66 @url{http://www-users.cs.umn.edu/~saad/software/SPARSKIT/paper.ps}}.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
67 With full matrices, knowledge of the point of an element of the matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
68 within the matrix is implied by its position in the computers memory.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
69 However, this is not the case for sparse matrices, and so the positions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
70 of the non-zero elements of the matrix must equally be stored.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
71
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
72 An obvious way to do this is by storing the elements of the matrix as
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
73 triplets, with two elements being their position in the array
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
74 (rows and column) and the third being the data itself. This is conceptually
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
75 easy to grasp, but requires more storage than is strictly needed.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
76
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
77 The storage technique used within Octave is the compressed column
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
78 format. In this format the position of each element in a row and the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
79 data are stored as previously. However, if we assume that all elements
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
80 in the same column are stored adjacent in the computers memory, then
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
81 we only need to store information on the number of non-zero elements
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
82 in each column, rather than their positions. Thus assuming that the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
83 matrix has more non-zero elements than there are columns in the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
84 matrix, we win in terms of the amount of memory used.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
85
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
86 In fact, the column index contains one more element than the number of
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
87 columns, with the first element always being zero. The advantage of
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
88 this is a simplification in the code, in that there is no special case
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
89 for the first or last columns. A short example, demonstrating this in
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
90 C is.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
91
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
92 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
93 for (j = 0; j < nc; j++)
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
94 for (i = cidx (j); i < cidx(j+1); i++)
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
95 printf ("non-zero element (%i,%i) is %d\n",
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
96 ridx(i), j, data(i));
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
97 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
98
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
99 A clear understanding might be had by considering an example of how the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
100 above applies to an example matrix. Consider the matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
101
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
102 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
103 @group
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
104 1 2 0 0
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
105 0 0 0 3
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
106 0 0 0 4
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
107 @end group
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
108 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
109
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
110 The non-zero elements of this matrix are
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
111
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
112 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
113 @group
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
114 (1, 1) @result{} 1
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
115 (1, 2) @result{} 2
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
116 (2, 4) @result{} 3
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
117 (3, 4) @result{} 4
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
118 @end group
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
119 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
120
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
121 This will be stored as three vectors @var{cidx}, @var{ridx} and @var{data},
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
122 representing the column indexing, row indexing and data respectively. The
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
123 contents of these three vectors for the above matrix will be
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
124
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
125 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
126 @group
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
127 @var{cidx} = [0, 1, 2, 2, 4]
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
128 @var{ridx} = [0, 0, 1, 2]
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
129 @var{data} = [1, 2, 3, 4]
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
130 @end group
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
131 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
132
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
133 Note that this is the representation of these elements with the first row
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
134 and column assumed to start at zero, while in Octave itself the row and
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
135 column indexing starts at one. Thus the number of elements in the
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
136 @var{i}-th column is given by @code{@var{cidx} (@var{i} + 1) -
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
137 @var{cidx} (@var{i})}.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
138
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
139 Although Octave uses a compressed column format, it should be noted
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
140 that compressed row formats are equally possible. However, in the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
141 context of mixed operations between mixed sparse and dense matrices,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
142 it makes sense that the elements of the sparse matrices are in the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
143 same order as the dense matrices. Octave stores dense matrices in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
144 column major ordering, and so sparse matrices are equally stored in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
145 this manner.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
146
5324
d2d11284528e [project @ 2005-04-29 14:56:45 by jwe]
jwe
parents: 5322
diff changeset
147 A further constraint on the sparse matrix storage used by Octave is that
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
148 all elements in the rows are stored in increasing order of their row
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
149 index, which makes certain operations faster. However, it imposes
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
150 the need to sort the elements on the creation of sparse matrices. Having
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
151 disordered elements is potentially an advantage in that it makes operations
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
152 such as concatenating two sparse matrices together easier and faster, however
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
153 it adds complexity and speed problems elsewhere.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
154
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
155 @node Creation, Information, Storage, Basics
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
156 @subsection Creating Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
157
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
158 There are several means to create sparse matrix.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
159
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
160 @table @asis
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
161 @item Returned from a function
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
162 There are many functions that directly return sparse matrices. These include
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
163 @dfn{speye}, @dfn{sprand}, @dfn{spdiag}, etc.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
164 @item Constructed from matrices or vectors
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
165 The function @dfn{sparse} allows a sparse matrix to be constructed from
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
166 three vectors representing the row, column and data. Alternatively, the
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
167 function @dfn{spconvert} uses a three column matrix format to allow easy
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
168 importation of data from elsewhere.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
169 @item Created and then filled
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
170 The function @dfn{sparse} or @dfn{spalloc} can be used to create an empty
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
171 matrix that is then filled by the user
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
172 @item From a user binary program
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
173 The user can directly create the sparse matrix within an oct-file.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
174 @end table
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
175
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
176 There are several basic functions to return specific sparse
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
177 matrices. For example the sparse identity matrix, is a matrix that is
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
178 often needed. It therefore has its own function to create it as
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
179 @code{speye (@var{n})} or @code{speye (@var{r}, @var{c})}, which
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
180 creates an @var{n}-by-@var{n} or @var{r}-by-@var{c} sparse identity
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
181 matrix.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
182
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
183 Another typical sparse matrix that is often needed is a random distribution
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
184 of random elements. The functions @dfn{sprand} and @dfn{sprandn} perform
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
185 this for uniform and normal random distributions of elements. They have exactly
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
186 the same calling convention, where @code{sprand (@var{r}, @var{c}, @var{d})},
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
187 creates an @var{r}-by-@var{c} sparse matrix with a density of filled
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
188 elements of @var{d}.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
189
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
190 Other functions of interest that directly create sparse matrices, are
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
191 @dfn{spdiag} or its generalization @dfn{spdiags}, that can take the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
192 definition of the diagonals of the matrix and create the sparse matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
193 that corresponds to this. For example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
194
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
195 @example
6411
2f64090cdc14 [project @ 2007-03-14 22:06:15 by jwe]
jwe
parents: 6334
diff changeset
196 s = spdiag (sparse(randn(1,n)), -1);
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
197 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
198
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
199 creates a sparse (@var{n}+1)-by-(@var{n}+1) sparse matrix with a single
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
200 diagonal defined.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
201
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
202 @DOCSTRING(spatan2)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
203
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
204 @DOCSTRING(spcumprod)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
205
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
206 @DOCSTRING(spcumsum)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
207
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
208 @DOCSTRING(spdiag)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
209
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
210 @DOCSTRING(spdiags)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
211
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
212 @DOCSTRING(speye)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
213
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
214 @DOCSTRING(spfun)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
215
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
216 @DOCSTRING(spmax)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
217
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
218 @DOCSTRING(spmin)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
219
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
220 @DOCSTRING(spones)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
221
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
222 @DOCSTRING(spprod)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
223
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
224 @DOCSTRING(sprand)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
225
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
226 @DOCSTRING(sprandn)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
227
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
228 @DOCSTRING(sprandsym)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
229
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
230 @DOCSTRING(spsum)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
231
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
232 @DOCSTRING(spsumsq)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
233
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
234 The recommended way for the user to create a sparse matrix, is to create
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
235 two vectors containing the row and column index of the data and a third
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
236 vector of the same size containing the data to be stored. For example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
237
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
238 @example
6421
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
239 ri = ci = d = [];
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
240 for j = 1:c
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
241 ri = [ri; randperm(r)(1:n)'];
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
242 ci = [ci; j*ones(n,1)];
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
243 d = [d; rand(n,1)];
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
244 endfor
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
245 s = sparse (ri, ci, d, r, c);
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
246 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
247
6421
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
248 creates an @var{r}-by-@var{c} sparse matrix with a random distribution
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
249 of @var{n} (<@var{r}) elements per column. The elements of the vectors
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
250 do not need to be sorted in any particular order as Octave will sort
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
251 them prior to storing the data. However, pre-sorting the data will
cac156381f81 [project @ 2007-03-20 17:39:19 by jwe]
jwe
parents: 6411
diff changeset
252 make the creation of the sparse matrix faster.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
253
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
254 The function @dfn{spconvert} takes a three or four column real matrix.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
255 The first two columns represent the row and column index respectively and
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
256 the third and four columns, the real and imaginary parts of the sparse
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
257 matrix. The matrix can contain zero elements and the elements can be
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
258 sorted in any order. Adding zero elements is a convenient way to define
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
259 the size of the sparse matrix. For example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
260
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
261 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
262 s = spconvert ([1 2 3 4; 1 3 4 4; 1 2 3 0]')
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
263 @result{} Compressed Column Sparse (rows=4, cols=4, nnz=3)
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
264 (1 , 1) -> 1
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
265 (2 , 3) -> 2
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
266 (3 , 4) -> 3
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
267 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
268
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
269 An example of creating and filling a matrix might be
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
270
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
271 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
272 k = 5;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
273 nz = r * k;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
274 s = spalloc (r, c, nz)
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
275 for j = 1:c
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
276 idx = randperm (r);
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
277 s (:, j) = [zeros(r - k, 1); ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
278 rand(k, 1)] (idx);
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
279 endfor
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
280 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
281
5324
d2d11284528e [project @ 2005-04-29 14:56:45 by jwe]
jwe
parents: 5322
diff changeset
282 It should be noted, that due to the way that the Octave
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
283 assignment functions are written that the assignment will reallocate
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
284 the memory used by the sparse matrix at each iteration of the above loop.
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
285 Therefore the @dfn{spalloc} function ignores the @var{nz} argument and
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
286 does not preassign the memory for the matrix. Therefore, it is vitally
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
287 important that code using to above structure should be vectorized
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
288 as much as possible to minimize the number of assignments and reduce the
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
289 number of memory allocations.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
290
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
291 @DOCSTRING(full)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
292
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
293 @DOCSTRING(spalloc)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
294
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
295 @DOCSTRING(sparse)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
296
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
297 @DOCSTRING(spconvert)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
298
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
299 @DOCSTRING(spfind)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
300
6570
49f0820425a8 [project @ 2007-04-24 23:06:56 by jwe]
jwe
parents: 6531
diff changeset
301 The above problem can be avoided in oct-files. However, the construction
49f0820425a8 [project @ 2007-04-24 23:06:56 by jwe]
jwe
parents: 6531
diff changeset
302 of a sparse matrix from an oct-file is more complex than can be
49f0820425a8 [project @ 2007-04-24 23:06:56 by jwe]
jwe
parents: 6531
diff changeset
303 discussed in this brief introduction, and you are referred to chapter
49f0820425a8 [project @ 2007-04-24 23:06:56 by jwe]
jwe
parents: 6531
diff changeset
304 @ref{Dynamically Linked Functions}, to have a full description of the
49f0820425a8 [project @ 2007-04-24 23:06:56 by jwe]
jwe
parents: 6531
diff changeset
305 techniques involved.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
306
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
307 @node Information, Operators and Functions, Creation, Basics
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
308 @subsection Finding out Information about Sparse Matrices
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
309
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
310 There are a number of functions that allow information concerning
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
311 sparse matrices to be obtained. The most basic of these is
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
312 @dfn{issparse} that identifies whether a particular Octave object is
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
313 in fact a sparse matrix.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
314
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
315 Another very basic function is @dfn{nnz} that returns the number of
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
316 non-zero entries there are in a sparse matrix, while the function
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
317 @dfn{nzmax} returns the amount of storage allocated to the sparse
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
318 matrix. Note that Octave tends to crop unused memory at the first
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
319 opportunity for sparse objects. There are some cases of user created
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
320 sparse objects where the value returned by @dfn{nzmaz} will not be
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
321 the same as @dfn{nnz}, but in general they will give the same
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
322 result. The function @dfn{spstats} returns some basic statistics on
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
323 the columns of a sparse matrix including the number of elements, the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
324 mean and the variance of each column.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
325
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
326 @DOCSTRING(issparse)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
327
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
328 @DOCSTRING(nnz)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
329
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
330 @DOCSTRING(nonzeros)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
331
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
332 @DOCSTRING(nzmax)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
333
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
334 @DOCSTRING(spstats)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
335
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
336 When solving linear equations involving sparse matrices Octave
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
337 determines the means to solve the equation based on the type of the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
338 matrix as discussed in @ref{Sparse Linear Algebra}. Octave probes the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
339 matrix type when the div (/) or ldiv (\) operator is first used with
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
340 the matrix and then caches the type. However the @dfn{matrix_type}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
341 function can be used to determine the type of the sparse matrix prior
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
342 to use of the div or ldiv operators. For example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
343
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
344 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
345 a = tril (sprandn(1024, 1024, 0.02), -1) ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
346 + speye(1024);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
347 matrix_type (a);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
348 ans = Lower
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
349 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
350
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
351 show that Octave correctly determines the matrix type for lower
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
352 triangular matrices. @dfn{matrix_type} can also be used to force
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
353 the type of a matrix to be a particular type. For example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
354
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
355 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
356 a = matrix_type (tril (sprandn (1024, ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
357 1024, 0.02), -1) + speye(1024), 'Lower');
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
358 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
359
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
360 This allows the cost of determining the matrix type to be
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
361 avoided. However, incorrectly defining the matrix type will result in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
362 incorrect results from solutions of linear equations, and so it is
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
363 entirely the responsibility of the user to correctly identify the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
364 matrix type
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
365
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
366 There are several graphical means of finding out information about
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
367 sparse matrices. The first is the @dfn{spy} command, which displays
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
368 the structure of the non-zero elements of the
7007
6304d9ea0a30 [project @ 2007-10-11 16:26:36 by jwe]
jwe
parents: 7001
diff changeset
369 matrix. @xref{fig:spmatrix}, for an example of the use of
5704
3d8d8ce93c2c [project @ 2006-03-21 21:53:56 by jwe]
jwe
parents: 5681
diff changeset
370 @dfn{spy}. More advanced graphical information can be obtained with the
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
371 @dfn{treeplot}, @dfn{etreeplot} and @dfn{gplot} commands.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
372
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
373 @float Figure,fig:spmatrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
374 @image{spmatrix,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
375 @caption{Structure of simple sparse matrix.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
376 @end float
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
377
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
378 One use of sparse matrices is in graph theory, where the
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
379 interconnections between nodes are represented as an adjacency
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
380 matrix. That is, if the i-th node in a graph is connected to the j-th
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
381 node. Then the ij-th node (and in the case of undirected graphs the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
382 ji-th node) of the sparse adjacency matrix is non-zero. If each node
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
383 is then associated with a set of co-ordinates, then the @dfn{gplot}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
384 command can be used to graphically display the interconnections
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
385 between nodes.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
386
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
387 As a trivial example of the use of @dfn{gplot}, consider the example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
388
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
389 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
390 A = sparse([2,6,1,3,2,4,3,5,4,6,1,5],
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
391 [1,1,2,2,3,3,4,4,5,5,6,6],1,6,6);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
392 xy = [0,4,8,6,4,2;5,0,5,7,5,7]';
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
393 gplot(A,xy)
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
394 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
395
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
396 which creates an adjacency matrix @code{A} where node 1 is connected
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
397 to nodes 2 and 6, node 2 with nodes 1 and 3, etc. The co-ordinates of
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
398 the nodes are given in the n-by-2 matrix @code{xy}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
399 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
400 @xref{fig:gplot}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
401
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
402 @float Figure,fig:gplot
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
403 @image{gplot,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
404 @caption{Simple use of the @dfn{gplot} command.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
405 @end float
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
406 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
407
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
408 The dependencies between the nodes of a Cholesky factorization can be
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
409 calculated in linear time without explicitly needing to calculate the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
410 Cholesky factorization by the @code{etree} command. This command
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
411 returns the elimination tree of the matrix and can be displayed
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
412 graphically by the command @code{treeplot(etree(A))} if @code{A} is
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
413 symmetric or @code{treeplot(etree(A+A'))} otherwise.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
414
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
415 @DOCSTRING(spy)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
416
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
417 @DOCSTRING(etree)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
418
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
419 @DOCSTRING(etreeplot)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
420
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
421 @DOCSTRING(gplot)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
422
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
423 @DOCSTRING(treeplot)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
424
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
425 @node Operators and Functions, , Information, Basics
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
426 @subsection Basic Operators and Functions on Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
427
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
428 @menu
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
429 * Functions:: Sparse Functions
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
430 * ReturnType:: The Return Types of Operators and Functions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
431 * MathConsiderations:: Mathematical Considerations
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
432 @end menu
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
433
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
434 @node Functions, ReturnType, Operators and Functions, Operators and Functions
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
435 @subsubsection Sparse Functions
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
436
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
437 An important consideration in the use of the sparse functions of
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
438 Octave is that many of the internal functions of Octave, such as
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
439 @dfn{diag}, can not accept sparse matrices as an input. The sparse
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
440 implementation in Octave therefore uses the @dfn{dispatch}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
441 function to overload the normal Octave functions with equivalent
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
442 functions that work with sparse matrices. However, at any time the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
443 sparse matrix specific version of the function can be used by
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
444 explicitly calling its function name.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
445
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
446 The table below lists all of the sparse functions of Octave. Note that
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
447 the names of the
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
448 specific sparse forms of the functions are typically the same as
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
449 the general versions with a @dfn{sp} prefix. In the table below, and the
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
450 rest of this article the specific sparse versions of the functions are
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
451 used.
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
452
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
453 @c Table includes in comments the missing sparse functions
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
454
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
455 @table @asis
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
456 @item Generate sparse matrices:
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
457 @dfn{spalloc}, @dfn{spdiags}, @dfn{speye}, @dfn{sprand},
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
458 @dfn{sprandn}, @dfn{sprandsym}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
459
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
460 @item Sparse matrix conversion:
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
461 @dfn{full}, @dfn{sparse}, @dfn{spconvert}, @dfn{spfind}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
462
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
463 @item Manipulate sparse matrices
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
464 @dfn{issparse}, @dfn{nnz}, @dfn{nonzeros}, @dfn{nzmax},
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
465 @dfn{spfun}, @dfn{spones}, @dfn{spy}
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
466
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
467 @item Graph Theory:
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
468 @dfn{etree}, @dfn{etreeplot}, @dfn{gplot},
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
469 @dfn{treeplot}
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
470 @c @dfn{treelayout}
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
471
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
472 @item Sparse matrix reordering:
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
473 @dfn{ccolamd}, @dfn{colamd}, @dfn{colperm}, @dfn{csymamd},
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
474 @dfn{dmperm}, @dfn{symamd}, @dfn{randperm}, @dfn{symrcm}
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
475
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
476 @item Linear algebra:
6754
451b346d8c2f [project @ 2007-06-25 17:31:46 by jwe]
jwe
parents: 6750
diff changeset
477 @dfn{matrix_type}, @dfn{spchol}, @dfn{cpcholinv},
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
478 @dfn{spchol2inv}, @dfn{spdet}, @dfn{spinv}, @dfn{spkron},
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
479 @dfn{splchol}, @dfn{splu}, @dfn{spqr}, @dfn{normest},
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
480 @dfn{sprank}
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
481 @c @dfn{condest}, @dfn{spaugment}
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
482 @c @dfn{eigs}, @dfn{svds} but these are in octave-forge for now
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
483
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
484 @item Iterative techniques:
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
485 @dfn{luinc}, @dfn{pcg}, @dfn{pcr}
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
486 @c @dfn{bicg}, @dfn{bicgstab}, @dfn{cholinc}, @dfn{cgs}, @dfn{gmres},
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
487 @c @dfn{lsqr}, @dfn{minres}, @dfn{qmr}, @dfn{symmlq}
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
488
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
489 @item Miscellaneous:
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
490 @dfn{spparms}, @dfn{symbfact}, @dfn{spstats},
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
491 @dfn{spprod}, @dfn{spcumsum}, @dfn{spsum},
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
492 @dfn{spsumsq}, @dfn{spmin}, @dfn{spmax}, @dfn{spatan2},
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
493 @dfn{spdiag}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
494 @end table
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
495
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
496 In addition all of the standard Octave mapper functions (ie. basic
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
497 math functions that take a single argument) such as @dfn{abs}, etc
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
498 can accept sparse matrices. The reader is referred to the documentation
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
499 supplied with these functions within Octave itself for further
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
500 details.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
501
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
502 @node ReturnType, MathConsiderations, Functions, Operators and Functions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
503 @subsubsection The Return Types of Operators and Functions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
504
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
505 The two basic reasons to use sparse matrices are to reduce the memory
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
506 usage and to not have to do calculations on zero elements. The two are
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
507 closely related in that the computation time on a sparse matrix operator
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
508 or function is roughly linear with the number of non-zero elements.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
509
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
510 Therefore, there is a certain density of non-zero elements of a matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
511 where it no longer makes sense to store it as a sparse matrix, but rather
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
512 as a full matrix. For this reason operators and functions that have a
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
513 high probability of returning a full matrix will always return one. For
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
514 example adding a scalar constant to a sparse matrix will almost always
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
515 make it a full matrix, and so the example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
516
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
517 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
518 speye(3) + 0
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
519 @result{} 1 0 0
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
520 0 1 0
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
521 0 0 1
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
522 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
523
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
524 returns a full matrix as can be seen. Additionally all sparse functions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
525 test the amount of memory occupied by the sparse matrix to see if the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
526 amount of storage used is larger than the amount used by the full
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
527 equivalent. Therefore @code{speye (2) * 1} will return a full matrix as
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
528 the memory used is smaller for the full version than the sparse version.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
529
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
530 As all of the mixed operators and functions between full and sparse
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
531 matrices exist, in general this does not cause any problems. However,
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
532 one area where it does cause a problem is where a sparse matrix is
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
533 promoted to a full matrix, where subsequent operations would resparsify
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
534 the matrix. Such cases are rare, but can be artificially created, for
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
535 example @code{(fliplr(speye(3)) + speye(3)) - speye(3)} gives a full
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
536 matrix when it should give a sparse one. In general, where such cases
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
537 occur, they impose only a small memory penalty.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
538
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
539 There is however one known case where this behavior of Octave's
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
540 sparse matrices will cause a problem. That is in the handling of the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
541 @dfn{diag} function. Whether @dfn{diag} returns a sparse or full matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
542 depending on the type of its input arguments. So
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
543
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
544 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
545 a = diag (sparse([1,2,3]), -1);
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
546 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
547
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
548 should return a sparse matrix. To ensure this actually happens, the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
549 @dfn{sparse} function, and other functions based on it like @dfn{speye},
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
550 always returns a sparse matrix, even if the memory used will be larger
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
551 than its full representation.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
552
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
553 @node MathConsiderations, , ReturnType, Operators and Functions
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
554 @subsubsection Mathematical Considerations
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
555
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
556 The attempt has been made to make sparse matrices behave in exactly the
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
557 same manner as there full counterparts. However, there are certain differences
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
558 and especially differences with other products sparse implementations.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
559
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
560 Firstly, the "./" and ".^" operators must be used with care. Consider what
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
561 the examples
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
562
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
563 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
564 s = speye (4);
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
565 a1 = s .^ 2;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
566 a2 = s .^ s;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
567 a3 = s .^ -2;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
568 a4 = s ./ 2;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
569 a5 = 2 ./ s;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
570 a6 = s ./ s;
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
571 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
572
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
573 will give. The first example of @var{s} raised to the power of 2 causes
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
574 no problems. However @var{s} raised element-wise to itself involves a
6431
ff87ad14403f [project @ 2007-03-22 18:20:31 by jwe]
jwe
parents: 6421
diff changeset
575 large number of terms @code{0 .^ 0} which is 1. There @code{@var{s} .^
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
576 @var{s}} is a full matrix.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
577
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
578 Likewise @code{@var{s} .^ -2} involves terms terms like @code{0 .^ -2} which
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
579 is infinity, and so @code{@var{s} .^ -2} is equally a full matrix.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
580
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
581 For the "./" operator @code{@var{s} ./ 2} has no problems, but
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
582 @code{2 ./ @var{s}} involves a large number of infinity terms as well
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
583 and is equally a full matrix. The case of @code{@var{s} ./ @var{s}}
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
584 involves terms like @code{0 ./ 0} which is a @code{NaN} and so this
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
585 is equally a full matrix with the zero elements of @var{s} filled with
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
586 @code{NaN} values.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
587
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
588 The above behavior is consistent with full matrices, but is not
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
589 consistent with sparse implementations in other products.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
590
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
591 A particular problem of sparse matrices comes about due to the fact that
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
592 as the zeros are not stored, the sign-bit of these zeros is equally not
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
593 stored. In certain cases the sign-bit of zero is important. For example
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
594
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
595 @example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
596 a = 0 ./ [-1, 1; 1, -1];
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
597 b = 1 ./ a
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
598 @result{} -Inf Inf
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
599 Inf -Inf
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
600 c = 1 ./ sparse (a)
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
601 @result{} Inf Inf
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
602 Inf Inf
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
603 @end example
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
604
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
605 To correct this behavior would mean that zero elements with a negative
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
606 sign-bit would need to be stored in the matrix to ensure that their
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
607 sign-bit was respected. This is not done at this time, for reasons of
6750
2de995da10b8 [project @ 2007-06-24 21:37:08 by dbateman]
dbateman
parents: 6620
diff changeset
608 efficiency, and so the user is warned that calculations where the sign-bit
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
609 of zero is important must not be done using sparse matrices.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
610
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
611 In general any function or operator used on a sparse matrix will
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
612 result in a sparse matrix with the same or a larger number of non-zero
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
613 elements than the original matrix. This is particularly true for the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
614 important case of sparse matrix factorizations. The usual way to
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
615 address this is to reorder the matrix, such that its factorization is
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
616 sparser than the factorization of the original matrix. That is the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
617 factorization of @code{L * U = P * S * Q} has sparser terms @code{L}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
618 and @code{U} than the equivalent factorization @code{L * U = S}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
619
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
620 Several functions are available to reorder depending on the type of the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
621 matrix to be factorized. If the matrix is symmetric positive-definite,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
622 then @dfn{symamd} or @dfn{csymamd} should be used. Otherwise
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
623 @dfn{colamd} or @dfn{ccolamd} should be used. For completeness
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
624 the reordering functions @dfn{colperm} and @dfn{randperm} are
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
625 also available.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
626
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
627 @xref{fig:simplematrix}, for an example of the structure of a simple
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
628 positive definite matrix.
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
629
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
630 @float Figure,fig:simplematrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
631 @image{spmatrix,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
632 @caption{Structure of simple sparse matrix.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
633 @end float
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
634
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
635 The standard Cholesky factorization of this matrix can be
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
636 obtained by the same command that would be used for a full
5652
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
637 matrix. This can be visualized with the command
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
638 @code{r = chol(A); spy(r);}.
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
639 @ifset HAVE_CHOLMOD
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
640 @ifset HAVE_COLAMD
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
641 @xref{fig:simplechol}.
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
642 @end ifset
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
643 @end ifset
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
644 The original matrix had
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
645 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
646 @ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
647 43
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
648 @end ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
649 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
650 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
651 598
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
652 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
653 non-zero terms, while this Cholesky factorization has
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
654 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
655 @ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
656 71,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
657 @end ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
658 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
659 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
660 10200,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
661 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
662 with only half of the symmetric matrix being stored. This
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
663 is a significant level of fill in, and although not an issue
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
664 for such a small test case, can represents a large overhead
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
665 in working with other sparse matrices.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
666
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
667 The appropriate sparsity preserving permutation of the original
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
668 matrix is given by @dfn{symamd} and the factorization using this
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
669 reordering can be visualized using the command @code{q = symamd(A);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
670 r = chol(A(q,q)); spy(r)}. This gives
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
671 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
672 @ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
673 29
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
674 @end ifnothtml
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
675 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
676 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
677 399
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
678 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
679 non-zero terms which is a significant improvement.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
680
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
681 The Cholesky factorization itself can be used to determine the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
682 appropriate sparsity preserving reordering of the matrix during the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
683 factorization, In that case this might be obtained with three return
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
684 arguments as r@code{[r, p, q] = chol(A); spy(r)}.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
685
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
686 @ifset HAVE_CHOLMOD
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
687 @ifset HAVE_COLAMD
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
688 @float Figure,fig:simplechol
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
689 @image{spchol,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
690 @caption{Structure of the un-permuted Cholesky factorization of the above matrix.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
691 @end float
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
692
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
693 @float Figure,fig:simplecholperm
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
694 @image{spcholperm,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
695 @caption{Structure of the permuted Cholesky factorization of the above matrix.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
696 @end float
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
697 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
698 @end ifset
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
699
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
700 In the case of an asymmetric matrix, the appropriate sparsity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
701 preserving permutation is @dfn{colamd} and the factorization using
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
702 this reordering can be visualized using the command @code{q =
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
703 colamd(A); [l, u, p] = lu(A(:,q)); spy(l+u)}.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
704
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
705 Finally, Octave implicitly reorders the matrix when using the div (/)
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
706 and ldiv (\) operators, and so no the user does not need to explicitly
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
707 reorder the matrix to maximize performance.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
708
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
709 @DOCSTRING(ccolamd)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
710
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
711 @DOCSTRING(colamd)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
712
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
713 @DOCSTRING(colperm)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
714
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
715 @DOCSTRING(csymamd)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
716
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
717 @DOCSTRING(dmperm)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
718
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
719 @DOCSTRING(symamd)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
720
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
721 @DOCSTRING(symrcm)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
722
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
723 @node Sparse Linear Algebra, Iterative Techniques, Basics, Sparse Matrices
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
724 @section Linear Algebra on Sparse Matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
725
5324
d2d11284528e [project @ 2005-04-29 14:56:45 by jwe]
jwe
parents: 5322
diff changeset
726 Octave includes a poly-morphic solver for sparse matrices, where
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
727 the exact solver used to factorize the matrix, depends on the properties
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
728 of the sparse matrix itself. Generally, the cost of determining the matrix type
5322
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
729 is small relative to the cost of factorizing the matrix itself, but in any
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
730 case the matrix type is cached once it is calculated, so that it is not
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
731 re-determined each time it is used in a linear equation.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
732
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
733 The selection tree for how the linear equation is solve is
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
734
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
735 @enumerate 1
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
736 @item If the matrix is diagonal, solve directly and goto 8
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
737
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
738 @item If the matrix is a permuted diagonal, solve directly taking into
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
739 account the permutations. Goto 8
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
740
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
741 @item If the matrix is square, banded and if the band density is less
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
742 than that given by @code{spparms ("bandden")} continue, else goto 4.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
743
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
744 @enumerate a
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
745 @item If the matrix is tridiagonal and the right-hand side is not sparse
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
746 continue, else goto 3b.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
747
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
748 @enumerate
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
749 @item If the matrix is hermitian, with a positive real diagonal, attempt
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
750 Cholesky factorization using @sc{Lapack} xPTSV.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
751
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
752 @item If the above failed or the matrix is not hermitian with a positive
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
753 real diagonal use Gaussian elimination with pivoting using
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
754 @sc{Lapack} xGTSV, and goto 8.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
755 @end enumerate
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
756
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
757 @item If the matrix is hermitian with a positive real diagonal, attempt
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
758 Cholesky factorization using @sc{Lapack} xPBTRF.
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
759
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
760 @item if the above failed or the matrix is not hermitian with a positive
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
761 real diagonal use Gaussian elimination with pivoting using
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
762 @sc{Lapack} xGBTRF, and goto 8.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
763 @end enumerate
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
764
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
765 @item If the matrix is upper or lower triangular perform a sparse forward
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
766 or backward substitution, and goto 8
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
767
5322
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
768 @item If the matrix is a upper triangular matrix with column permutations
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
769 or lower triangular matrix with row permutations, perform a sparse forward
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
770 or backward substitution, and goto 8
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
771
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
772 @item If the matrix is square, hermitian with a real positive diagonal, attempt
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
773 sparse Cholesky factorization using CHOLMOD.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
774
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
775 @item If the sparse Cholesky factorization failed or the matrix is not
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
776 hermitian with a real positive diagonal, and the matrix is square, factorize
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
777 using UMFPACK.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
778
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
779 @item If the matrix is not square, or any of the previous solvers flags
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
780 a singular or near singular matrix, find a minimum norm solution using
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
781 CXSPARSE@footnote{CHOLMOD, UMFPACK and CXSPARSE are written by Tim Davis
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
782 and are available at http://www.cise.ufl.edu/research/sparse/}.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
783 @end enumerate
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
784
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
785 The band density is defined as the number of non-zero values in the matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
786 divided by the number of non-zero values in the matrix. The banded matrix
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
787 solvers can be entirely disabled by using @dfn{spparms} to set @code{bandden}
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
788 to 1 (i.e. @code{spparms ("bandden", 1)}).
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
789
5681
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
790 The QR solver factorizes the problem with a Dulmage-Mendhelsohn, to
6939
46d1ad37d943 [project @ 2007-10-01 16:12:20 by jwe]
jwe
parents: 6754
diff changeset
791 separate the problem into blocks that can be treated as over-determined,
5681
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
792 multiple well determined blocks, and a final over-determined block. For
6939
46d1ad37d943 [project @ 2007-10-01 16:12:20 by jwe]
jwe
parents: 6754
diff changeset
793 matrices with blocks of strongly connected nodes this is a big win as
5681
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
794 LU decomposition can be used for many blocks. It also significantly
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
795 improves the chance of finding a solution to over-determined problems
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
796 rather than just returning a vector of @dfn{NaN}'s.
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
797
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
798 All of the solvers above, can calculate an estimate of the condition
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
799 number. This can be used to detect numerical stability problems in the
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
800 solution and force a minimum norm solution to be used. However, for
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
801 narrow banded, triangular or diagonal matrices, the cost of
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
802 calculating the condition number is significant, and can in fact
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
803 exceed the cost of factoring the matrix. Therefore the condition
6939
46d1ad37d943 [project @ 2007-10-01 16:12:20 by jwe]
jwe
parents: 6754
diff changeset
804 number is not calculated in these cases, and Octave relies on simpler
46d1ad37d943 [project @ 2007-10-01 16:12:20 by jwe]
jwe
parents: 6754
diff changeset
805 techniques to detect singular matrices or the underlying LAPACK code in
5681
233d98d95659 [project @ 2006-03-16 17:48:55 by dbateman]
dbateman
parents: 5652
diff changeset
806 the case of banded matrices.
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
807
5322
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
808 The user can force the type of the matrix with the @code{matrix_type}
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
809 function. This overcomes the cost of discovering the type of the matrix.
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
810 However, it should be noted incorrectly identifying the type of the matrix
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
811 will lead to unpredictable results, and so @code{matrix_type} should be
5506
b4cfbb0ec8c4 [project @ 2005-10-23 19:09:32 by dbateman]
dbateman
parents: 5324
diff changeset
812 used with care.
5322
22994a5730f9 [project @ 2005-04-29 13:04:24 by dbateman]
dbateman
parents: 5282
diff changeset
813
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
814 @DOCSTRING(normest)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
815
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
816 @DOCSTRING(spchol)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
817
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
818 @DOCSTRING(spcholinv)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
819
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
820 @DOCSTRING(spchol2inv)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
821
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
822 @DOCSTRING(spdet)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
823
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
824 @DOCSTRING(spinv)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
825
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
826 @DOCSTRING(spkron)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
827
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
828 @DOCSTRING(splchol)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
829
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
830 @DOCSTRING(splu)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
831
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
832 @DOCSTRING(spparms)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
833
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
834 @DOCSTRING(spqr)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
835
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
836 @DOCSTRING(sprank)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
837
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
838 @DOCSTRING(symbfact)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
839
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
840 @node Iterative Techniques, Real Life Example, Sparse Linear Algebra, Sparse Matrices
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
841 @section Iterative Techniques applied to sparse matrices
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
842
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
843 The left division @code{\} and right division @code{/} operators,
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
844 discussed in the previous section, use direct solvers to resolve a
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
845 linear equation of the form @code{@var{x} = @var{A} \ @var{b}} or
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
846 @code{@var{x} = @var{b} / @var{A}}. Octave equally includes a number of
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
847 functions to solve sparse linear equations using iterative techniques.
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
848
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
849 @DOCSTRING(pcg)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
850
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
851 @DOCSTRING(pcr)
5837
55404f3b0da1 [project @ 2006-06-01 19:05:31 by jwe]
jwe
parents: 5708
diff changeset
852
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
853 The speed with which an iterative solver converges to a solution can be
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
854 accelerated with the use of a pre-conditioning matrix @var{M}. In this
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
855 case the linear equation @code{@var{M}^-1 * @var{x} = @var{M}^-1 *
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
856 @var{A} \ @var{b}} is solved instead. Typical pre-conditioning matrices
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
857 are partial factorizations of the original matrix.
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
858
6620
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
859 @DOCSTRING(luinc)
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
860
bf4bdc21dc8d [project @ 2007-05-14 17:35:46 by jwe]
jwe
parents: 6570
diff changeset
861 @node Real Life Example, , Iterative Techniques, Sparse Matrices
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
862 @section Real Life Example of the use of Sparse Matrices
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
863
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
864 A common application for sparse matrices is in the solution of Finite
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
865 Element Models. Finite element models allow numerical solution of
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
866 partial differential equations that do not have closed form solutions,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
867 typically because of the complex shape of the domain.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
868
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
869 In order to motivate this application, we consider the boundary value
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
870 Laplace equation. This system can model scalar potential fields, such
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
871 as heat or electrical potential. Given a medium
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
872 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
873 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
874 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
875 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
876 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
877 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
878 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
879 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
880 with boundary
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
881 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
882 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
883 $\partial\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
884 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
885 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
886 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
887 dOmega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
888 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
889 . At all points on the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
890 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
891 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
892 $\partial\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
893 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
894 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
895 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
896 dOmega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
897 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
898 the boundary conditions are known, and we wish to calculate the potential in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
899 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
900 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
901 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
902 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
903 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
904 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
905 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
906 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
907 . Boundary conditions may specify the potential (Dirichlet
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
908 boundary condition), its normal derivative across the boundary
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
909 (Neumann boundary condition), or a weighted sum of the potential and
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
910 its derivative (Cauchy boundary condition).
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
911
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
912 In a thermal model, we want to calculate the temperature in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
913 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
914 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
915 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
916 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
917 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
918 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
919 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
920 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
921 and know the boundary temperature (Dirichlet condition)
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
922 or heat flux (from which we can calculate the Neumann condition
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
923 by dividing by the thermal conductivity at the boundary). Similarly,
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
924 in an electrical model, we want to calculate the voltage in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
925 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
926 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
927 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
928 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
929 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
930 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
931 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
932 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
933 and know the boundary voltage (Dirichlet) or current
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
934 (Neumann condition after diving by the electrical conductivity).
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
935 In an electrical model, it is common for much of the boundary
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
936 to be electrically isolated; this is a Neumann boundary condition
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
937 with the current equal to zero.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
938
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
939 The simplest finite element models will divide
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
940 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
941 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
942 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
943 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
944 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
945 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
946 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
947 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
948 into simplexes (triangles in 2D, pyramids in 3D).
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
949 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
950 We take as an 3D example a cylindrical liquid filled tank with a small
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
951 non-conductive ball from the EIDORS project@footnote{EIDORS - Electrical
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
952 Impedance Tomography and Diffuse optical Tomography Reconstruction Software
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
953 @url{http://eidors3d.sourceforge.net}}. This is model is designed to reflect
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
954 an application of electrical impedance tomography, where current patterns
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
955 are applied to such a tank in order to image the internal conductivity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
956 distribution. In order to describe the FEM geometry, we have a matrix of
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
957 vertices @code{nodes} and simplices @code{elems}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
958 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
959
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
960 The following example creates a simple rectangular 2D electrically
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
961 conductive medium with 10 V and 20 V imposed on opposite sides
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
962 (Dirichlet boundary conditions). All other edges are electrically
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
963 isolated.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
964
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
965 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
966 node_y= [1;1.2;1.5;1.8;2]*ones(1,11);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
967 node_x= ones(5,1)*[1,1.05,1.1,1.2, ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
968 1.3,1.5,1.7,1.8,1.9,1.95,2];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
969 nodes= [node_x(:), node_y(:)];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
970
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
971 [h,w]= size(node_x);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
972 elems= [];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
973 for idx= 1:w-1
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
974 widx= (idx-1)*h;
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
975 elems= [elems; ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
976 widx+[(1:h-1);(2:h);h+(1:h-1)]'; ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
977 widx+[(2:h);h+(2:h);h+(1:h-1)]' ];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
978 endfor
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
979
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
980 E= size(elems,1); # No. of simplices
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
981 N= size(nodes,1); # No. of vertices
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
982 D= size(elems,2); # dimensions+1
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
983 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
984
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
985 This creates a N-by-2 matrix @code{nodes} and a E-by-3 matrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
986 @code{elems} with values, which define finite element triangles:
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
987
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
988 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
989 nodes(1:7,:)'
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
990 1.00 1.00 1.00 1.00 1.00 1.05 1.05 ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
991 1.00 1.20 1.50 1.80 2.00 1.00 1.20 ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
992
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
993 elems(1:7,:)'
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
994 1 2 3 4 2 3 4 ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
995 2 3 4 5 7 8 9 ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
996 6 7 8 9 6 7 8 ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
997 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
998
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
999 Using a first order FEM, we approximate the electrical conductivity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1000 distribution in
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1001 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1002 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1003 $\Omega$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1004 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1005 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1006 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1007 Omega
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1008 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1009 as constant on each simplex (represented by the vector @code{conductivity}).
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1010 Based on the finite element geometry, we first calculate a system (or
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1011 stiffness) matrix for each simplex (represented as 3-by-3 elements on the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1012 diagonal of the element-wise system matrix @code{SE}. Based on @code{SE}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1013 and a N-by-DE connectivity matrix @code{C}, representing the connections
7001
8b0cfeb06365 [project @ 2007-10-10 18:02:59 by jwe]
jwe
parents: 6939
diff changeset
1014 between simplices and vertices, the global connectivity matrix @code{S} is
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1015 calculated.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1016
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1017 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1018 # Element conductivity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1019 conductivity= [1*ones(1,16), ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1020 2*ones(1,48), 1*ones(1,16)];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1021
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1022 # Connectivity matrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1023 C = sparse ((1:D*E), reshape (elems', ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1024 D*E, 1), 1, D*E, N);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1025
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1026 # Calculate system matrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1027 Siidx = floor ([0:D*E-1]'/D) * D * ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1028 ones(1,D) + ones(D*E,1)*(1:D) ;
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1029 Sjidx = [1:D*E]'*ones(1,D);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1030 Sdata = zeros(D*E,D);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1031 dfact = factorial(D-1);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1032 for j=1:E
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1033 a = inv([ones(D,1), ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1034 nodes(elems(j,:), :)]);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1035 const = conductivity(j) * 2 / ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1036 dfact / abs(det(a));
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1037 Sdata(D*(j-1)+(1:D),:) = const * ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1038 a(2:D,:)' * a(2:D,:);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1039 endfor
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1040 # Element-wise system matrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1041 SE= sparse(Siidx,Sjidx,Sdata);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1042 # Global system matrix
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1043 S= C'* SE *C;
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1044 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1045
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1046 The system matrix acts like the conductivity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1047 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1048 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1049 $S$
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1050 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1051 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1052 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1053 @code{S}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1054 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1055 in Ohm's law
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1056 @iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1057 @tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1058 $SV = I$.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1059 @end tex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1060 @end iftex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1061 @ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1062 @code{S * V = I}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1063 @end ifinfo
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1064 Based on the Dirichlet and Neumann boundary conditions, we are able to
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1065 solve for the voltages at each vertex @code{V}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1066
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1067 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1068 # Dirichlet boundary conditions
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1069 D_nodes=[1:5, 51:55];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1070 D_value=[10*ones(1,5), 20*ones(1,5)];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1071
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1072 V= zeros(N,1);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1073 V(D_nodes) = D_value;
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1074 idx = 1:N; # vertices without Dirichlet
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1075 # boundary condns
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1076 idx(D_nodes) = [];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1077
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1078 # Neumann boundary conditions. Note that
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1079 # N_value must be normalized by the
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1080 # boundary length and element conductivity
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1081 N_nodes=[];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1082 N_value=[];
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1083
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1084 Q = zeros(N,1);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1085 Q(N_nodes) = N_value;
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1086
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1087 V(idx) = S(idx,idx) \ ( Q(idx) - ...
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1088 S(idx,D_nodes) * V(D_nodes));
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1089 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1090
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1091 Finally, in order to display the solution, we show each solved voltage
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1092 value in the z-axis for each simplex vertex.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1093 @ifset htmltex
5652
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1094 @ifset HAVE_CHOLMOD
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1095 @ifset HAVE_UMFPACK
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1096 @ifset HAVE_COLAMD
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1097 @xref{fig:femmodel}.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1098 @end ifset
5652
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1099 @end ifset
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1100 @end ifset
f37b562ec93c [project @ 2006-03-09 15:12:20 by dbateman]
dbateman
parents: 5648
diff changeset
1101 @end ifset
5648
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1102
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1103 @example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1104 elemx = elems(:,[1,2,3,1])';
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1105 xelems = reshape (nodes(elemx, 1), 4, E);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1106 yelems = reshape (nodes(elemx, 2), 4, E);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1107 velems = reshape (V(elemx), 4, E);
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1108 plot3 (xelems,yelems,velems,'k');
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1109 print ('grid.eps');
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1110 @end example
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1111
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1112
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1113 @ifset htmltex
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1114 @ifset HAVE_CHOLMOD
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1115 @ifset HAVE_UMFPACK
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1116 @ifset HAVE_COLAMD
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1117 @float Figure,fig:femmodel
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1118 @image{grid,8cm}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1119 @caption{Example finite element model the showing triangular elements.
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1120 The height of each vertex corresponds to the solution value.}
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1121 @end float
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1122 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1123 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1124 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1125 @end ifset
69a4f320d95a [project @ 2006-03-08 20:17:37 by dbateman]
dbateman
parents: 5576
diff changeset
1126
5164
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
1127 @c Local Variables: ***
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
1128 @c Mode: texinfo ***
57077d0ddc8e [project @ 2005-02-25 19:55:24 by jwe]
jwe
parents:
diff changeset
1129 @c End: ***