Mercurial > octave-dspies
annotate doc/interpreter/external.txi @ 18075:24759ac2b8cb stable
doc: Periodic spellcheck of documentation
* aspell-octave.en.pws: Remove WebKit from private dictionary.
* external.txi: Fix typos and use two spaces for sentence breaks.
* install.txi: Use @nospell macro around gl2ps.
* rgb2ind.m: Correct British spelling of colour to American spelling.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 04 Dec 2013 08:41:22 -0800 |
parents | 3341d2f1e5db |
children | adb7c7e6a4a1 |
rev | line source |
---|---|
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
17289
diff
changeset
|
1 @c Copyright (C) 2007-2013 John W. Eaton and David Bateman |
7018 | 2 @c Copyright (C) 2007 Paul Thomas and Christoph Spiel |
3 @c | |
4 @c This file is part of Octave. | |
5 @c | |
6 @c Octave is free software; you can redistribute it and/or modify it | |
7 @c under the terms of the GNU General Public License as published by the | |
8 @c Free Software Foundation; either version 3 of the License, or (at | |
9 @c your option) any later version. | |
10 @c | |
11 @c Octave is distributed in the hope that it will be useful, but WITHOUT | |
12 @c ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 @c FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 @c for more details. | |
15 @c | |
16 @c You should have received a copy of the GNU General Public License | |
17 @c along with Octave; see the file COPYING. If not, see | |
18 @c <http://www.gnu.org/licenses/>. | |
6578 | 19 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
20 @node External Code Interface |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
21 @appendix External Code Interface |
6569 | 22 @cindex dynamic-linking |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
23 @cindex Dynamically Linked Functions |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
24 @cindex Octave API |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
25 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
26 “The sum of human wisdom is not contained in any one language" |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
27 ---Ezra Pound |
6569 | 28 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
29 Octave is a fantastic language for solving many problems in science and |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
30 engineering. However, it is not the only computer language and there |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
31 are times when you may want to use code written in other languages. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
32 Good reasons for doing so include: 1) not re-inventing the wheel; existing |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
33 function libraries which have been thoroughly tested and debugged or |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
34 large scale simulation codebases are a good example, 2) accessing unique |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
35 capabilities of a different language; for example the well-known regular |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
36 expression functions of Perl (but don't do that because @code{regexp} |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
37 already exists in Octave). |
6569 | 38 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
39 Performance should generally @strong{not} be a reason for using compiled |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
40 extensions. Although compiled extensions can run faster, particularly |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
41 if they replace a loop in Octave code, this is almost never the best path |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
42 to take. First, there are many techniques to speed up Octave performance while |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
43 remaining within the language. Second, Octave is a high-level language that |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
44 makes it easy to perform common mathematical tasks. Giving that up means |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
45 shifting the focus from solving the real problem to solving a computer |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
46 programming problem. It means returning to low-level constructs such as |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
47 pointers, memory management, mathematical overflow/underflow, etc. Because |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
48 of the low level nature, and the fact that the compiled code is executed outside |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
49 of Octave, there is the very real possibility of crashing the interpreter and |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
50 losing work. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
51 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
52 Before going further, you should first determine if you really need to bother |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
53 writing code outside of Octave. |
6569 | 54 |
55 @itemize @bullet | |
56 @item | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
57 Can I get the same functionality using the Octave scripting language alone? |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
58 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
59 Even when a function already exists outside the language, it may be |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
60 better to simply reproduce the behavior in an m-file rather than attempt to |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
61 interface to the outside code. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
62 |
6569 | 63 @item |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
64 Is the code thoroughly optimized for Octave? |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
65 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
66 If performance is an issue you should always start with the in-language |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
67 techniques for getting better performance. Chief among these is vectorization |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
68 (@pxref{Vectorization and Faster Code Execution}) which not only makes the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
69 code concise and more understandable but improves performance (10X-100X). |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
70 If loops must be used, make sure that the allocation of space for variables |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
71 takes place outside the loops using an assignment to a matrix of the right |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
72 size, or zeros. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
73 |
6569 | 74 @item |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
75 Does the code make as much use as possible of existing built-in library |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
76 routines? |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
77 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
78 These routines are highly optimized and many do not carry the overhead |
6569 | 79 of being interpreted. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
80 |
6569 | 81 @item |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
82 Does writing a dynamically linked function represent a useful investment |
6569 | 83 of your time, relative to staying in Octave? |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
84 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
85 It will take time to learn Octave's interface for external code and |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
86 there will inevitably be issues with tools such as compilers. |
6569 | 87 @end itemize |
88 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
89 With that said, Octave offers a versatile interface for including chunks |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
90 of compiled code as dynamically linked extensions. These dynamically linked |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
91 functions can be called from the interpreter in the same manner as any |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
92 ordinary function. The interface is bi-directional and external code can |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
93 call Octave functions (like @code{plot}) which otherwise might be very |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
94 difficult to develop. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
95 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
96 The interface is centered around supporting the languages C++, C, and Fortran. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
97 Octave itself is written in C++ and can call external C++/C code through its |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
98 native oct-file interface. The C language is also supported through the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
99 mex-file interface for compatibility with @sc{matlab}. Fortran code is easiest |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
100 to reach through the oct-file interface. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
101 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
102 Because many other languages provide C or C++ APIs it is relatively simple |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
103 to build bridges between Octave and other languages. This is also a way to |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
104 bridge to hardware resources which often have device drivers written in C. |
6569 | 105 |
106 @menu | |
17152
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
107 * Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
108 * Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
109 * Standalone Programs:: |
6569 | 110 @end menu |
111 | |
112 @node Oct-Files | |
113 @section Oct-Files | |
114 @cindex oct-files | |
115 @cindex mkoctfile | |
116 @cindex oct | |
117 | |
118 @menu | |
17152
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
119 * Getting Started with Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
120 * Matrices and Arrays in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
121 * Character Strings in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
122 * Cell Arrays in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
123 * Structures in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
124 * Sparse Matrices in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
125 * Accessing Global Variables in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
126 * Calling Octave Functions from Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
127 * Calling External Code from Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
128 * Allocating Local Memory in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
129 * Input Parameter Checking in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
130 * Exception and Error Handling in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
131 * Documentation and Test of Oct-Files:: |
6593 | 132 @c * Application Programming Interface for Oct-Files:: |
6569 | 133 @end menu |
134 | |
135 @node Getting Started with Oct-Files | |
136 @subsection Getting Started with Oct-Files | |
137 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
138 Oct-files are pieces of C++ code that have been compiled with the Octave |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
139 API into a dynamically loadable object. They take their name from the file |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
140 which contains the object which has the extension @file{.oct}. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
141 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
142 Finding a C++ compiler, using the correct switches, adding the right include |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
143 paths for header files, etc. is a difficult task. Octave automates this by |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
144 providing the @code{mkoctfile} command with which to build oct-files. The |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
145 command is available from within Octave or at the shell command line. |
6569 | 146 |
147 @DOCSTRING(mkoctfile) | |
148 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
149 Consider the following short example which introduces the basics of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
150 writing a C++ function that can be linked to Octave. |
6569 | 151 |
9906 | 152 @example |
153 @group | |
154 @EXAMPLEFILE(helloworld.cc) | |
155 @end group | |
156 @end example | |
6569 | 157 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
158 The first critical line is @code{#include <octave/oct.h>} which |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
159 makes available most of the definitions necessary for a C++ oct-file. |
12489
ac3bdc27734e
Clarify in manual that the mkoctfile examples are in C++
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
11573
diff
changeset
|
160 Note that @file{octave/oct.h} is a C++ header and cannot be directly |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
161 @code{#include}'ed in a C source file, nor any other language. |
6569 | 162 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
163 Included by @file{oct.h} is a definition for the macro |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
164 @w{@code{DEFUN_DLD}} which creates a dynamically loaded function. This |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
165 macro takes four arguments: |
6569 | 166 |
167 @enumerate 1 | |
6571 | 168 @item The function name as it will be seen in Octave, |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
169 |
6572 | 170 @item The list of arguments to the function of type @code{octave_value_list}, |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
171 |
6569 | 172 @item The number of output arguments, which can and often is omitted if |
173 not used, and | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
174 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
175 @item The string to use for the help text of the function. |
6569 | 176 @end enumerate |
177 | |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
178 The return type of functions defined with @w{@code{DEFUN_DLD}} is always |
6572 | 179 @code{octave_value_list}. |
6569 | 180 |
181 There are a couple of important considerations in the choice of function | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
182 name. First, it must be a valid Octave function name and so must be a |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
183 sequence of letters, digits, and underscores not starting with a |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
184 digit. Second, as Octave uses the function name to define the filename |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
185 it attempts to find the function in, the function name in the |
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
186 @w{@code{DEFUN_DLD}} macro must match the filename of the oct-file. Therefore, |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
187 the above function should be in a file @file{helloworld.cc}, and would be |
6572 | 188 compiled to an oct-file using the command |
6569 | 189 |
190 @example | |
191 mkoctfile helloworld.cc | |
192 @end example | |
193 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
194 This will create a file called @file{helloworld.oct} that is the compiled |
6571 | 195 version of the function. It should be noted that it is perfectly |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
196 acceptable to have more than one @w{@code{DEFUN_DLD}} function in a source |
6571 | 197 file. However, there must either be a symbolic link to the oct-file for |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
198 each of the functions defined in the source code with the @w{@code{DEFUN_DLD}} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
199 macro or the @code{autoload} (@ref{Function Files}) function should be used. |
6569 | 200 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
201 The rest of the function shows how to find the number of input arguments, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
202 how to print through the Octave pager, and return from the function. After |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
203 compiling this function as above, an example of its use is |
6569 | 204 |
205 @example | |
206 @group | |
6572 | 207 helloworld (1, 2, 3) |
208 @print{} Hello World has 3 input arguments and 0 output arguments. | |
6569 | 209 @end group |
210 @end example | |
211 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
212 Subsequent sections show how to use specific classes from Octave's core |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
213 internals. Base classes like dMatrix (a matrix of double values) are |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
214 found in the directory @file{liboctave/array}. The definitive reference for |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
215 how to use a particular class is the header file itself. However, it is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
216 often enough just to study the examples in the manual in order to be able |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
217 to use the class. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
218 |
6569 | 219 @node Matrices and Arrays in Oct-Files |
220 @subsection Matrices and Arrays in Oct-Files | |
221 | |
222 Octave supports a number of different array and matrix classes, the | |
6571 | 223 majority of which are based on the Array class. The exception is the |
224 sparse matrix types discussed separately below. There are three basic | |
225 matrix types | |
6569 | 226 |
6572 | 227 @table @code |
6569 | 228 @item Matrix |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
229 A double precision matrix class defined in @file{dMatrix.h}, |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
230 |
6569 | 231 @item ComplexMatrix |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
232 A complex matrix class defined in @file{CMatrix.h}, and |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
233 |
6569 | 234 @item BoolMatrix |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
235 A boolean matrix class defined in @file{boolMatrix.h}. |
6569 | 236 @end table |
237 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
238 These are the basic two-dimensional matrix types of Octave. In |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
239 addition there are a number of multi-dimensional array types including |
6569 | 240 |
6572 | 241 @table @code |
6569 | 242 @item NDArray |
6572 | 243 A double precision array class defined in @file{dNDArray.h} |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
244 |
6569 | 245 @item ComplexNDarray |
6572 | 246 A complex array class defined in @file{CNDArray.h} |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
247 |
6569 | 248 @item boolNDArray |
6572 | 249 A boolean array class defined in @file{boolNDArray.h} |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
250 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
251 @item int8NDArray |
6572 | 252 @itemx int16NDArray |
253 @itemx int32NDArray | |
254 @itemx int64NDArray | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
255 8, 16, 32, and 64-bit signed array classes defined in |
6572 | 256 @file{int8NDArray.h}, @file{int16NDArray.h}, etc. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
257 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
258 @item uint8NDArray |
6572 | 259 @itemx uint16NDArray |
260 @itemx uint32NDArray | |
261 @itemx uint64NDArray | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
262 8, 16, 32, and 64-bit unsigned array classes defined in |
6572 | 263 @file{uint8NDArray.h}, @file{uint16NDArray.h}, etc. |
6569 | 264 @end table |
265 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
266 There are several basic ways of constructing matrices or |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
267 multi-dimensional arrays. Using the class @code{Matrix} as an example |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
268 one can |
6569 | 269 |
270 @itemize @bullet | |
6571 | 271 @item |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
272 Create an empty matrix or array with the empty constructor. For example: |
6569 | 273 |
274 @example | |
275 Matrix a; | |
276 @end example | |
277 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
278 This can be used for all matrix and array types. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
279 |
6571 | 280 @item |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
281 Define the dimensions of the matrix or array with a dim_vector which has |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
282 the same characteristics as the vector returned from @code{size}. For example: |
6569 | 283 |
284 @example | |
285 @group | |
6572 | 286 dim_vector dv (2); |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
287 dv(0) = 2; dv(1) = 3; // 2 rows, 3 columns |
6572 | 288 Matrix a (dv); |
6569 | 289 @end group |
290 @end example | |
291 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
292 This can be used on all matrix and array types. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
293 |
6569 | 294 @item |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
295 Define the number of rows and columns in the matrix. For example: |
6569 | 296 |
297 @example | |
6572 | 298 Matrix a (2, 2) |
6569 | 299 @end example |
300 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
301 However, this constructor can only be used with matrix types. |
6569 | 302 @end itemize |
303 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
304 These types all share a number of basic methods and operators. Many bear |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
305 a resemblance to functions that exist in the interpreter. A selection of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
306 useful methods include |
6569 | 307 |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
308 @deftypefn {Method} {T&} operator () (octave_idx_type) |
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
309 @deftypefnx {Method} {T&} elem (octave_idx_type) |
6572 | 310 The @code{()} operator or @code{elem} method allow the values of the |
311 matrix or array to be read or set. These can take a single argument, | |
312 which is of type @code{octave_idx_type}, that is the index into the matrix or | |
6571 | 313 array. Additionally, the matrix type allows two argument versions of the |
6572 | 314 @code{()} operator and elem method, giving the row and column index of the |
6569 | 315 value to obtain or set. |
6572 | 316 @end deftypefn |
6569 | 317 |
7001 | 318 Note that these functions do significant error checking and so in some |
319 circumstances the user might prefer to access the data of the array or | |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
320 matrix directly through the @nospell{fortran_vec} method discussed below. |
6572 | 321 |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
322 @deftypefn {Method} {} octave_idx_type numel (void) const |
6569 | 323 The total number of elements in the matrix or array. |
6572 | 324 @end deftypefn |
325 | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
326 @deftypefn {Method} {size_t} byte_size (void) const |
6569 | 327 The number of bytes used to store the matrix or array. |
6572 | 328 @end deftypefn |
329 | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
330 @deftypefn {Method} {dim_vector} dims (void) const |
6569 | 331 The dimensions of the matrix or array in value of type dim_vector. |
6572 | 332 @end deftypefn |
333 | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
334 @deftypefn {Method} {int} ndims (void) const |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
335 The number of dimensions of the matrix or array. Matrices are 2-D, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
336 but arrays can be N-dimensional. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
337 @end deftypefn |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
338 |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
339 @deftypefn {Method} {void} resize (const dim_vector&) |
6572 | 340 A method taking either an argument of type @code{dim_vector}, or in the |
341 case of a matrix two arguments of type @code{octave_idx_type} defining | |
342 the number of rows and columns in the matrix. | |
343 @end deftypefn | |
344 | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
345 @deftypefn {Method} {T*} fortran_vec (void) |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
346 This method returns a pointer to the underlying data of the matrix or |
6569 | 347 array so that it can be manipulated directly, either within Octave or by |
348 an external library. | |
6572 | 349 @end deftypefn |
6569 | 350 |
6572 | 351 Operators such an @code{+}, @code{-}, or @code{*} can be used on the |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
352 majority of the matrix and array types. In addition there are a number of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
353 methods that are of interest only for matrices such as @code{transpose}, |
6572 | 354 @code{hermitian}, @code{solve}, etc. |
6569 | 355 |
356 The typical way to extract a matrix or array from the input arguments of | |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
357 @w{@code{DEFUN_DLD}} function is as follows |
6569 | 358 |
9906 | 359 @example |
360 @EXAMPLEFILE(addtwomatrices.cc) | |
361 @end example | |
6569 | 362 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
363 To avoid segmentation faults causing Octave to abort this function |
6569 | 364 explicitly checks that there are sufficient arguments available before |
6571 | 365 accessing these arguments. It then obtains two multi-dimensional arrays |
6572 | 366 of type @code{NDArray} and adds these together. Note that the array_value |
367 method is called without using the @code{is_matrix_type} type, and instead the | |
6571 | 368 error_state is checked before returning @code{A + B}. The reason to |
6569 | 369 prefer this is that the arguments might be a type that is not an |
6572 | 370 @code{NDArray}, but it would make sense to convert it to one. The |
371 @code{array_value} method allows this conversion to be performed | |
372 transparently if possible, and sets @code{error_state} if it is not. | |
6569 | 373 |
6572 | 374 @code{A + B}, operating on two @code{NDArray}'s returns an |
375 @code{NDArray}, which is cast to an @code{octave_value} on the return | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
376 from the function. An example of the use of this demonstration function is |
6569 | 377 |
378 @example | |
379 @group | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
380 addtwomatrices (ones (2, 2), eye (2, 2)) |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
381 @result{} 2 1 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
382 1 2 |
6569 | 383 @end group |
384 @end example | |
385 | |
6572 | 386 A list of the basic @code{Matrix} and @code{Array} types, the methods to |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
387 extract these from an @code{octave_value}, and the associated header file is |
6572 | 388 listed below. |
6569 | 389 |
390 @multitable @columnfractions .3 .4 .3 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
391 @headitem Type @tab Function @tab Source Code |
6572 | 392 @item @code{RowVector} @tab @code{row_vector_value} @tab @file{dRowVector.h} |
393 @item @code{ComplexRowVector} @tab @code{complex_row_vector_value} @tab @file{CRowVector.h} | |
394 @item @code{ColumnVector} @tab @code{column_vector_value} @tab @file{dColVector.h} | |
395 @item @code{ComplexColumnVector} @tab @code{complex_column_vector_value} @tab @file{CColVector.h} | |
396 @item @code{Matrix} @tab @code{matrix_value} @tab @file{dMatrix.h} | |
397 @item @code{ComplexMatrix} @tab @code{complex_matrix_value} @tab @file{CMatrix.h} | |
398 @item @code{boolMatrix} @tab @code{bool_matrix_value} @tab @file{boolMatrix.h} | |
399 @item @code{charMatrix} @tab @code{char_matrix_value} @tab @file{chMatrix.h} | |
400 @item @code{NDArray} @tab @code{array_value} @tab @file{dNDArray.h} | |
401 @item @code{ComplexNDArray} @tab @code{complex_array_value} @tab @file{CNDArray.h} | |
402 @item @code{boolNDArray} @tab @code{bool_array_value} @tab @file{boolNDArray.h} | |
403 @item @code{charNDArray} @tab @code{char_array_value} @tab @file{charNDArray.h} | |
404 @item @code{int8NDArray} @tab @code{int8_array_value} @tab @file{int8NDArray.h} | |
405 @item @code{int16NDArray} @tab @code{int16_array_value} @tab @file{int16NDArray.h} | |
406 @item @code{int32NDArray} @tab @code{int32_array_value} @tab @file{int32NDArray.h} | |
407 @item @code{int64NDArray} @tab @code{int64_array_value} @tab @file{int64NDArray.h} | |
408 @item @code{uint8NDArray} @tab @code{uint8_array_value} @tab @file{uint8NDArray.h} | |
409 @item @code{uint16NDArray} @tab @code{uint16_array_value} @tab @file{uint16NDArray.h} | |
410 @item @code{uint32NDArray} @tab @code{uint32_array_value} @tab @file{uint32NDArray.h} | |
411 @item @code{uint64NDArray} @tab @code{uint64_array_value} @tab @file{uint64NDArray.h} | |
6569 | 412 @end multitable |
413 | |
6572 | 414 @node Character Strings in Oct-Files |
415 @subsection Character Strings in Oct-Files | |
416 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
417 A character string in Octave is just a special @code{Array} class. |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
418 Consider the example: |
6572 | 419 |
9906 | 420 @example |
421 @EXAMPLEFILE(stringdemo.cc) | |
422 @end example | |
6572 | 423 |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
424 An example of the use of this function is |
6572 | 425 |
426 @example | |
427 @group | |
428 s0 = ["First String"; "Second String"]; | |
429 [s1,s2] = stringdemo (s0) | |
430 @result{} s1 = Second String | |
431 First String | |
432 | |
433 @result{} s2 = First String | |
434 Second String | |
435 | |
436 typeinfo (s2) | |
437 @result{} sq_string | |
438 typeinfo (s1) | |
439 @result{} string | |
440 @end group | |
441 @end example | |
442 | |
443 One additional complication of strings in Octave is the difference | |
444 between single quoted and double quoted strings. To find out if an | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
445 @code{octave_value} contains a single or double quoted string use |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
446 one of the predicate tests shown below. |
6572 | 447 |
448 @example | |
449 @group | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
450 if (args(0).is_sq_string ()) |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
451 octave_stdout << "First argument is a single quoted string\n"; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
452 else if (args(0).is_dq_string ()) |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
453 octave_stdout << "First argument is a double quoted string\n"; |
6572 | 454 @end group |
455 @end example | |
456 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
457 Note, however, that both types of strings are represented by the |
6572 | 458 @code{charNDArray} type, and so when assigning to an |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
459 @code{octave_value}, the type of string should be specified. For example: |
6572 | 460 |
461 @example | |
462 @group | |
463 octave_value_list retval; | |
464 charNDArray c; | |
465 @dots{} | |
6577 | 466 // Create single quoted string |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
467 retval(1) = octave_value (ch); // default constructor is sq_string |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
468 OR |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
469 retval(1) = octave_value (ch, '\''); // explicitly create sq_string |
6577 | 470 |
471 // Create a double quoted string | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
472 retval(0) = octave_value (ch, '"'); |
6572 | 473 @end group |
474 @end example | |
475 | |
476 @node Cell Arrays in Oct-Files | |
477 @subsection Cell Arrays in Oct-Files | |
478 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
479 Octave's cell type is also available from within oct-files. A cell |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
480 array is just an array of @code{octave_value}s, and thus each element of the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
481 cell array can be treated just like any other @code{octave_value}. A simple |
6572 | 482 example is |
483 | |
9906 | 484 @example |
485 @EXAMPLEFILE(celldemo.cc) | |
486 @end example | |
6572 | 487 |
488 Note that cell arrays are used less often in standard oct-files and so | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
489 the @file{Cell.h} header file must be explicitly included. The rest of the |
6572 | 490 example extracts the @code{octave_value}s one by one from the cell array and |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
491 returns them as individual return arguments. For example: |
6572 | 492 |
493 @example | |
494 @group | |
495 [b1, b2, b3] = celldemo (@{1, [1, 2], "test"@}) | |
496 @result{} | |
497 b1 = 1 | |
498 b2 = | |
499 | |
500 1 2 | |
501 | |
502 b3 = test | |
503 @end group | |
504 @end example | |
505 | |
506 @node Structures in Oct-Files | |
507 @subsection Structures in Oct-Files | |
508 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
509 A structure in Octave is a map between a number of fields represented and |
6572 | 510 their values. The Standard Template Library @code{map} class is used, |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
511 with the pair consisting of a @code{std::string} and an Octave |
6572 | 512 @code{Cell} variable. |
513 | |
514 A simple example demonstrating the use of structures within oct-files is | |
515 | |
9906 | 516 @example |
517 @EXAMPLEFILE(structdemo.cc) | |
518 @end example | |
6572 | 519 |
520 An example of its use is | |
521 | |
522 @example | |
523 @group | |
524 x.a = 1; x.b = "test"; x.c = [1, 2]; | |
525 structdemo (x, "b") | |
526 @result{} selected = test | |
527 @end group | |
528 @end example | |
529 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
530 The example above specifically uses the @code{octave_scalar_map} class which |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
531 is for representing a single struct. For structure arrays the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
532 @code{octave_map} class is used instead. The commented code shows how the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
533 demo could be modified to handle a structure array. In that case the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
534 @code{contents} method returns a @code{Cell} which may have more than one |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
535 element. Therefore, to obtain the underlying @code{octave_value} in |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
536 this single-struct example we write |
6572 | 537 |
538 @example | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
539 octave_value tmp = arg0.contents (arg1)(0); |
6572 | 540 @end example |
541 | |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10828
diff
changeset
|
542 @noindent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
543 where the trailing (0) is the () operator on the @code{Cell} object. If |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
544 this were a true structure array with multiple elements we could iterate |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
545 over the elements using the () operator. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
546 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
547 Structures are a relatively complex data container and there are more |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
548 functions available in @file{oct-map.h} which make coding with them easier |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
549 than relying on just @code{contents}. |
6572 | 550 |
551 @node Sparse Matrices in Oct-Files | |
552 @subsection Sparse Matrices in Oct-Files | |
6569 | 553 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
554 There are three classes of sparse objects that are of interest to the user. |
6569 | 555 |
6572 | 556 @table @code |
6569 | 557 @item SparseMatrix |
558 A double precision sparse matrix class | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
559 |
6569 | 560 @item SparseComplexMatrix |
561 A complex sparse matrix class | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
562 |
6569 | 563 @item SparseBoolMatrix |
564 A boolean sparse matrix class | |
565 @end table | |
566 | |
567 All of these classes inherit from the @code{Sparse<T>} template class, | |
6571 | 568 and so all have similar capabilities and usage. The @code{Sparse<T>} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
569 class was based on Octave's @code{Array<T>} class, and so users familiar |
6572 | 570 with Octave's @code{Array} classes will be comfortable with the use of |
6569 | 571 the sparse classes. |
572 | |
573 The sparse classes will not be entirely described in this section, due | |
6572 | 574 to their similarity with the existing @code{Array} classes. However, |
575 there are a few differences due the different nature of sparse objects, | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
576 and these will be described. First, although it is fundamentally |
6572 | 577 possible to have N-dimensional sparse objects, the Octave sparse classes do |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
578 not allow them at this time; All instances of the sparse classes |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
579 must be 2-dimensional. This means that @code{SparseMatrix} is actually |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
580 more similar to Octave's @code{Matrix} class than its @code{NDArray} class. |
6569 | 581 |
582 @menu | |
17152
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
583 * Array and Sparse Class Differences:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
584 * Creating Sparse Matrices in Oct-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
585 * Using Sparse Matrices in Oct-Files:: |
6569 | 586 @end menu |
587 | |
17152
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
588 @node Array and Sparse Class Differences |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
589 @subsubsection Array and Sparse Class Differences |
6569 | 590 |
591 The number of elements in a sparse matrix is considered to be the number | |
6571 | 592 of non-zero elements rather than the product of the dimensions. Therefore |
6569 | 593 |
594 @example | |
6577 | 595 @group |
596 SparseMatrix sm; | |
597 @dots{} | |
598 int nel = sm.nelem (); | |
599 @end group | |
6569 | 600 @end example |
601 | |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10828
diff
changeset
|
602 @noindent |
6571 | 603 returns the number of non-zero elements. If the user really requires the |
6569 | 604 number of elements in the matrix, including the non-zero elements, they |
6571 | 605 should use @code{numel} rather than @code{nelem}. Note that for very |
7001 | 606 large matrices, where the product of the two dimensions is larger than |
607 the representation of an unsigned int, then @code{numel} can overflow. | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
608 An example is @code{speye (1e6)} which will create a matrix with a million |
6571 | 609 rows and columns, but only a million non-zero elements. Therefore the |
6569 | 610 number of rows by the number of columns in this case is more than two |
611 hundred times the maximum value that can be represented by an unsigned int. | |
612 The use of @code{numel} should therefore be avoided useless it is known | |
613 it won't overflow. | |
614 | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
615 Extreme care must be take with the elem method and the @qcode{"()"} operator, |
6571 | 616 which perform basically the same function. The reason is that if a |
6569 | 617 sparse object is non-const, then Octave will assume that a |
6571 | 618 request for a zero element in a sparse matrix is in fact a request |
619 to create this element so it can be filled. Therefore a piece of | |
6569 | 620 code like |
621 | |
622 @example | |
6577 | 623 @group |
624 SparseMatrix sm; | |
625 @dots{} | |
626 for (int j = 0; j < nc; j++) | |
627 for (int i = 0; i < nr; i++) | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
628 std::cerr << " (" << i << "," << j << "): " << sm(i,j) << std::endl; |
6577 | 629 @end group |
6569 | 630 @end example |
631 | |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10828
diff
changeset
|
632 @noindent |
6569 | 633 is a great way of turning the sparse matrix into a dense one, and a |
634 very slow way at that since it reallocates the sparse object at each | |
635 zero element in the matrix. | |
636 | |
637 An easy way of preventing the above from happening is to create a temporary | |
6571 | 638 constant version of the sparse matrix. Note that only the container for |
6569 | 639 the sparse matrix will be copied, while the actual representation of the |
6571 | 640 data will be shared between the two versions of the sparse matrix. So this |
641 is not a costly operation. For example, the above would become | |
6569 | 642 |
643 @example | |
6577 | 644 @group |
645 SparseMatrix sm; | |
646 @dots{} | |
647 const SparseMatrix tmp (sm); | |
648 for (int j = 0; j < nc; j++) | |
649 for (int i = 0; i < nr; i++) | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
650 std::cerr << " (" << i << "," << j << "): " << tmp(i,j) << std::endl; |
6577 | 651 @end group |
6569 | 652 @end example |
653 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
654 Finally, as the sparse types aren't represented by a contiguous |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
655 block of memory, the @nospell{@code{fortran_vec}} method of the @code{Array<T>} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
656 is not available. It is, however, replaced by three separate methods |
6569 | 657 @code{ridx}, @code{cidx} and @code{data}, that access the raw compressed |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
658 column format that Octave sparse matrices are stored in. These methods can be |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
659 used in a manner similar to @code{elem} to allow the matrix to be accessed or |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
660 filled. However, in that case it is up to the user to respect the sparse |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
661 matrix compressed column format. |
6569 | 662 |
6572 | 663 @node Creating Sparse Matrices in Oct-Files |
664 @subsubsection Creating Sparse Matrices in Oct-Files | |
6569 | 665 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
666 There are several useful alternatives for creating a sparse matrix. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
667 The first is to create three vectors representing the row index, column index, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
668 and data values, and from these create the matrix. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
669 The second alternative is to create a sparse matrix with the appropriate |
6571 | 670 amount of space and then fill in the values. Both techniques have their |
6569 | 671 advantages and disadvantages. |
672 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
673 Below is an example of creating a small sparse matrix using the first |
6572 | 674 technique |
6569 | 675 |
676 @example | |
6577 | 677 @group |
678 int nz = 4, nr = 3, nc = 4; | |
679 | |
680 ColumnVector ridx (nz); | |
681 ColumnVector cidx (nz); | |
682 ColumnVector data (nz); | |
6569 | 683 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
684 ridx(0) = 0; cidx(0) = 0; data(0) = 1; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
685 ridx(1) = 0; cidx(1) = 1; data(1) = 2; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
686 ridx(2) = 1; cidx(2) = 3; data(2) = 3; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
687 ridx(3) = 2; cidx(3) = 3; data(3) = 4; |
6577 | 688 SparseMatrix sm (data, ridx, cidx, nr, nc); |
689 @end group | |
6569 | 690 @end example |
691 | |
6572 | 692 @noindent |
8817
03b7f618ab3d
include docstrings for new functions in the manual
John W. Eaton <jwe@octave.org>
parents:
8486
diff
changeset
|
693 which creates the matrix given in section |
03b7f618ab3d
include docstrings for new functions in the manual
John W. Eaton <jwe@octave.org>
parents:
8486
diff
changeset
|
694 @ref{Storage of Sparse Matrices}. Note that the compressed matrix |
03b7f618ab3d
include docstrings for new functions in the manual
John W. Eaton <jwe@octave.org>
parents:
8486
diff
changeset
|
695 format is not used at the time of the creation of the matrix itself, |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
696 but is used internally. |
6569 | 697 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
698 As discussed in the chapter on Sparse Matrices, the values of the sparse |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
699 matrix are stored in increasing column-major ordering. Although the data |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
700 passed by the user need not respect this requirement, pre-sorting the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
701 data will significantly speed up creation of the sparse matrix. |
6569 | 702 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
703 The disadvantage of this technique for creating a sparse matrix is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
704 that there is a brief time when two copies of the data exist. For |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
705 extremely memory constrained problems this may not be the best |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
706 technique for creating a sparse matrix. |
6569 | 707 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
708 The alternative is to first create a sparse matrix with the desired |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
709 number of non-zero elements and then later fill those elements in. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
710 Sample code: |
6569 | 711 |
6571 | 712 @example |
6577 | 713 @group |
714 int nz = 4, nr = 3, nc = 4; | |
715 SparseMatrix sm (nr, nc, nz); | |
716 sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; | |
717 @end group | |
6569 | 718 @end example |
719 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
720 This creates the same matrix as previously. Again, although not |
6569 | 721 strictly necessary, it is significantly faster if the sparse matrix is |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
722 created and the elements are added in column-major ordering. The reason |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
723 for this is that when elements are inserted at the end of the current list |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
724 of known elements then no element in the matrix needs to be moved to allow |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
725 the new element to be inserted; Only the column indexes need to be updated. |
6569 | 726 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
727 There are a few further points to note about this method of creating |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
728 a sparse matrix. First, it is possible to create a sparse matrix |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
729 with fewer elements than are actually inserted in the matrix. Therefore, |
6569 | 730 |
6571 | 731 @example |
6577 | 732 @group |
733 int nz = 4, nr = 3, nc = 4; | |
734 SparseMatrix sm (nr, nc, 0); | |
735 sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; | |
736 @end group | |
6569 | 737 @end example |
738 | |
6572 | 739 @noindent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
740 is perfectly valid. However, it is a very bad idea because as each new |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
741 element is added to the sparse matrix the matrix needs to request more |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
742 space and reallocate memory. This is an expensive operation, that will |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
743 significantly slow this means of creating a sparse matrix. Furthermore, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
744 it is possible to create a sparse matrix with too much storage, so having |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
745 @var{nz} greater than 4 is also valid. The disadvantage is that the matrix |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
746 occupies more memory than strictly needed. |
6569 | 747 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
748 It is not always possible to know the number of non-zero elements prior |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
749 to filling a matrix. For this reason the additional unused storage of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
750 a sparse matrix can be removed after its creation with the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
751 @code{maybe_compress} function. In addition, @code{maybe_compress} can |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
752 deallocate the unused storage, but it can also remove zero elements |
6569 | 753 from the matrix. The removal of zero elements from the matrix is |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
754 controlled by setting the argument of the @code{maybe_compress} function |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
755 to be @code{true}. However, the cost of removing the zeros is high because it |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
756 implies re-sorting the elements. If possible, it is better |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
757 if the user does not add the unnecessary zeros in the first place. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
758 An example of the use of @code{maybe_compress} is |
6569 | 759 |
760 @example | |
6577 | 761 @group |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
762 int nz = 6, nr = 3, nc = 4; |
6577 | 763 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
764 SparseMatrix sm1 (nr, nc, nz); |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
765 sm1(0,0) = 1; sm1(0,1) = 2; sm1(1,3) = 3; sm1(2,3) = 4; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
766 sm1.maybe_compress (); // No zero elements were added |
6569 | 767 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
768 SparseMatrix sm2 (nr, nc, nz); |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
769 sm2(0,0) = 1; sm2(0,1) = 2; sm(0,2) = 0; sm(1,2) = 0; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
770 sm1(1,3) = 3; sm1(2,3) = 4; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
771 sm2.maybe_compress (true); // Zero elements were added |
6577 | 772 @end group |
6569 | 773 @end example |
774 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
775 The use of the @code{maybe_compress} function should be avoided if |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
776 possible as it will slow the creation of the matrix. |
6569 | 777 |
778 A third means of creating a sparse matrix is to work directly with | |
6571 | 779 the data in compressed row format. An example of this technique might |
6569 | 780 be |
781 | |
782 @example | |
6577 | 783 octave_value arg; |
784 @dots{} | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
785 int nz = 6, nr = 3, nc = 4; // Assume we know the max # nz |
6577 | 786 SparseMatrix sm (nr, nc, nz); |
787 Matrix m = arg.matrix_value (); | |
6569 | 788 |
6577 | 789 int ii = 0; |
790 sm.cidx (0) = 0; | |
791 for (int j = 1; j < nc; j++) | |
792 @{ | |
793 for (int i = 0; i < nr; i++) | |
794 @{ | |
795 double tmp = foo (m(i,j)); | |
796 if (tmp != 0.) | |
797 @{ | |
798 sm.data(ii) = tmp; | |
799 sm.ridx(ii) = i; | |
800 ii++; | |
801 @} | |
802 @} | |
803 sm.cidx(j+1) = ii; | |
804 @} | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
805 sm.maybe_compress (); // If don't know a-priori the final # of nz. |
6569 | 806 @end example |
807 | |
6572 | 808 @noindent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
809 which is probably the most efficient means of creating a sparse matrix. |
6569 | 810 |
811 Finally, it might sometimes arise that the amount of storage initially | |
6571 | 812 created is insufficient to completely store the sparse matrix. Therefore, |
6569 | 813 the method @code{change_capacity} exists to reallocate the sparse memory. |
6571 | 814 The above example would then be modified as |
6569 | 815 |
816 @example | |
6577 | 817 octave_value arg; |
818 @dots{} | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
819 int nz = 6, nr = 3, nc = 4; // Assume we know the max # nz |
6577 | 820 SparseMatrix sm (nr, nc, nz); |
821 Matrix m = arg.matrix_value (); | |
6569 | 822 |
6577 | 823 int ii = 0; |
824 sm.cidx (0) = 0; | |
825 for (int j = 1; j < nc; j++) | |
826 @{ | |
827 for (int i = 0; i < nr; i++) | |
828 @{ | |
829 double tmp = foo (m(i,j)); | |
830 if (tmp != 0.) | |
831 @{ | |
832 if (ii == nz) | |
833 @{ | |
834 nz += 2; // Add 2 more elements | |
835 sm.change_capacity (nz); | |
836 @} | |
837 sm.data(ii) = tmp; | |
838 sm.ridx(ii) = i; | |
839 ii++; | |
840 @} | |
841 @} | |
842 sm.cidx(j+1) = ii; | |
843 @} | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
844 sm.maybe_mutate (); // If don't know a-priori the final # of nz. |
6569 | 845 @end example |
846 | |
847 Note that both increasing and decreasing the number of non-zero elements in | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
848 a sparse matrix is expensive as it involves memory reallocation. Also as |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
849 parts of the matrix, though not its entirety, exist as old and new copies |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
850 at the same time, additional memory is needed. Therefore, if possible this |
6569 | 851 should be avoided. |
852 | |
6572 | 853 @node Using Sparse Matrices in Oct-Files |
6569 | 854 @subsubsection Using Sparse Matrices in Oct-Files |
855 | |
856 Most of the same operators and functions on sparse matrices that are | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
857 available from the Octave command line are also available within oct-files. |
6569 | 858 The basic means of extracting a sparse matrix from an @code{octave_value} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
859 and returning it as an @code{octave_value}, can be seen in the |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
860 following example. |
6569 | 861 |
862 @example | |
6577 | 863 @group |
864 octave_value_list retval; | |
6569 | 865 |
6577 | 866 SparseMatrix sm = args(0).sparse_matrix_value (); |
7081 | 867 SparseComplexMatrix scm = |
868 args(1).sparse_complex_matrix_value (); | |
6577 | 869 SparseBoolMatrix sbm = args(2).sparse_bool_matrix_value (); |
870 @dots{} | |
871 retval(2) = sbm; | |
872 retval(1) = scm; | |
873 retval(0) = sm; | |
874 @end group | |
6569 | 875 @end example |
876 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
877 The conversion to an @code{octave_value} is handled by the sparse |
6569 | 878 @code{octave_value} constructors, and so no special care is needed. |
879 | |
880 @node Accessing Global Variables in Oct-Files | |
881 @subsection Accessing Global Variables in Oct-Files | |
882 | |
883 Global variables allow variables in the global scope to be | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
884 accessed. Global variables can be accessed within oct-files by using |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
885 the support functions @code{get_global_value} and @code{set_global_value}. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
886 @code{get_global_value} takes two arguments, the first is a string representing |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
887 the variable name to obtain. The second argument is a boolean argument |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
888 specifying what to do if no global variable of the desired name is found. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
889 An example of the use of these two functions is |
6569 | 890 |
9906 | 891 @example |
892 @EXAMPLEFILE(globaldemo.cc) | |
893 @end example | |
6569 | 894 |
895 An example of its use is | |
896 | |
897 @example | |
898 @group | |
899 global a b | |
900 b = 10; | |
901 globaldemo ("b") | |
902 @result{} 10 | |
903 globaldemo ("c") | |
904 @result{} "Global variable not found" | |
905 num2str (a) | |
906 @result{} 42 | |
907 @end group | |
908 @end example | |
909 | |
910 @node Calling Octave Functions from Oct-Files | |
911 @subsection Calling Octave Functions from Oct-Files | |
912 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
913 There is often a need to be able to call another Octave function from |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
914 within an oct-file, and there are many examples of such within Octave |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
915 itself. For example, the @code{quad} function is an oct-file that |
6569 | 916 calculates the definite integral by quadrature over a user supplied |
917 function. | |
918 | |
6571 | 919 There are also many ways in which a function might be passed. It might |
920 be passed as one of | |
6569 | 921 |
922 @enumerate 1 | |
923 @item Function Handle | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
924 |
6569 | 925 @item Anonymous Function Handle |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
926 |
6569 | 927 @item Inline Function |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
928 |
6569 | 929 @item String |
930 @end enumerate | |
931 | |
932 The example below demonstrates an example that accepts all four means of | |
6571 | 933 passing a function to an oct-file. |
6569 | 934 |
9906 | 935 @example |
936 @EXAMPLEFILE(funcdemo.cc) | |
937 @end example | |
6569 | 938 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
939 The first argument to this demonstration is the user-supplied function |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
940 and the remaining arguments are all passed to the user function. |
6569 | 941 |
942 @example | |
943 @group | |
6572 | 944 funcdemo (@@sin,1) |
6569 | 945 @result{} 0.84147 |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
946 funcdemo (@@(x) sin (x), 1) |
6569 | 947 @result{} 0.84147 |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
948 funcdemo (inline ("sin (x)"), 1) |
6569 | 949 @result{} 0.84147 |
6572 | 950 funcdemo ("sin",1) |
6569 | 951 @result{} 0.84147 |
952 funcdemo (@@atan2, 1, 1) | |
953 @result{} 0.78540 | |
954 @end group | |
955 @end example | |
956 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
957 When the user function is passed as a string the treatment of the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
958 function is different. In some cases it is necessary to have the |
6572 | 959 user supplied function as an @code{octave_function} object. In that |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
960 case the string argument can be used to create a temporary function |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
961 as demonstrated below. |
6569 | 962 |
963 @example | |
964 @group | |
6577 | 965 std::octave fcn_name = unique_symbol_name ("__fcn__"); |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
966 std::string fcode = "function y = "; |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
967 fcode.append (fcn_name); |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
968 fcode.append ("(x) y = "); |
6577 | 969 fcn = extract_function (args(0), "funcdemo", fcn_name, |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
970 fcode, "; endfunction"); |
6577 | 971 @dots{} |
972 if (fcn_name.length ()) | |
973 clear_function (fcn_name); | |
6569 | 974 @end group |
975 @end example | |
976 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
977 There are two important things to know in this case. First, the number of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
978 input arguments to the user function is fixed, and in the above example is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
979 a single argument. Second, to avoid leaving the temporary function in the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
980 Octave symbol table it should be cleared after use. Also, by convention |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
981 internal function names begin and end with the character sequence @samp{__}. |
6569 | 982 |
983 @node Calling External Code from Oct-Files | |
984 @subsection Calling External Code from Oct-Files | |
985 | |
986 Linking external C code to Octave is relatively simple, as the C | |
6571 | 987 functions can easily be called directly from C++. One possible issue is |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
988 that the declarations of the external C functions may need to be explicitly |
6571 | 989 defined as C functions to the compiler. If the declarations of the |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
990 external C functions are in the header @file{foo.h}, then the tactic to |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
991 ensure that the C++ compiler treats these declarations as C code is |
6569 | 992 |
993 @example | |
994 @group | |
995 #ifdef __cplusplus | |
6571 | 996 extern "C" |
6569 | 997 @{ |
998 #endif | |
999 #include "foo.h" | |
1000 #ifdef __cplusplus | |
1001 @} /* end extern "C" */ | |
1002 #endif | |
1003 @end group | |
1004 @end example | |
1005 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1006 Calling Fortran code, however, can pose more difficulties. This is due to |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1007 differences in the manner in which compilers treat the linking of Fortran code |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1008 with C or C++ code. Octave supplies a number of macros that allow consistent |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1009 behavior across a number of compilers. |
6569 | 1010 |
1011 The underlying Fortran code should use the @code{XSTOPX} function to | |
6571 | 1012 replace the Fortran @code{STOP} function. @code{XSTOPX} uses the Octave |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
1013 exception handler to treat failing cases in the Fortran code |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1014 explicitly. Note that Octave supplies its own replacement @sc{blas} |
6569 | 1015 @code{XERBLA} function, which uses @code{XSTOPX}. |
1016 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1017 If the code calls @code{XSTOPX}, then the @w{@code{F77_XFCN}} |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
1018 macro should be used to call the underlying Fortran function. The Fortran |
6569 | 1019 exception state can then be checked with the global variable |
6572 | 1020 @code{f77_exception_encountered}. If @code{XSTOPX} will not be called, |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1021 then the @w{@code{F77_FCN}} macro should be used instead to call the Fortran |
6569 | 1022 code. |
1023 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1024 There is no great harm in using @w{@code{F77_XFCN}} in all cases, except that |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1025 for Fortran code that is short running and executes a large number of times, |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1026 there is potentially an overhead in doing so. However, if @w{@code{F77_FCN}} |
6569 | 1027 is used with code that calls @code{XSTOP}, Octave can generate a |
1028 segmentation fault. | |
1029 | |
1030 An example of the inclusion of a Fortran function in an oct-file is | |
1031 given in the following example, where the C++ wrapper is | |
1032 | |
9906 | 1033 @example |
1034 @EXAMPLEFILE(fortdemo.cc) | |
1035 @end example | |
6569 | 1036 |
6572 | 1037 @noindent |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
1038 and the Fortran function is |
6569 | 1039 |
9906 | 1040 @example |
1041 @EXAMPLEFILE(fortsub.f) | |
1042 @end example | |
6569 | 1043 |
1044 This example demonstrates most of the features needed to link to an | |
1045 external Fortran function, including passing arrays and strings, as well | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1046 as exception handling. Both the Fortran and C++ files need to be compiled |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1047 in order for the example to work. |
6569 | 1048 |
1049 @example | |
1050 @group | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1051 mkoctfile fortdemo.cc fortsub.f |
6572 | 1052 [b, s] = fortdemo (1:3) |
6569 | 1053 @result{} |
1054 b = 1.00000 0.50000 0.33333 | |
1055 s = There are 3 values in the input vector | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1056 [b, s] = fortdemo (0:3) |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1057 error: fortdemo: fortsub: divide by zero |
6569 | 1058 @end group |
1059 @end example | |
1060 | |
1061 @node Allocating Local Memory in Oct-Files | |
1062 @subsection Allocating Local Memory in Oct-Files | |
1063 | |
1064 Allocating memory within an oct-file might seem easy as the C++ | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1065 new/delete operators can be used. However, in that case great care must be |
6571 | 1066 taken to avoid memory leaks. The preferred manner in which to allocate |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1067 memory for use locally is to use the @w{@code{OCTAVE_LOCAL_BUFFER}} macro. |
6572 | 1068 An example of its use is |
6569 | 1069 |
1070 @example | |
1071 OCTAVE_LOCAL_BUFFER (double, tmp, len) | |
1072 @end example | |
1073 | |
10846
a4f482e66b65
Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents:
10828
diff
changeset
|
1074 @noindent |
6569 | 1075 that returns a pointer @code{tmp} of type @code{double *} of length |
1076 @code{len}. | |
1077 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1078 In this case Octave itself will worry about reference counting and variable |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1079 scope and will properly free memory without programmer intervention. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1080 |
6569 | 1081 @node Input Parameter Checking in Oct-Files |
1082 @subsection Input Parameter Checking in Oct-Files | |
1083 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1084 As oct-files are compiled functions they open up the possibility of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1085 crashing Octave through careless function calls or memory faults. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1086 It is quite important that each and every function have a sufficient level |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1087 of parameter checking to ensure that Octave behaves well. |
6580 | 1088 |
1089 The minimum requirement, as previously discussed, is to check the number | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1090 of input arguments before using them to avoid referencing a non-existent |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1091 argument. However, in some cases this might not be sufficient as the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1092 underlying code imposes further constraints. For example, an external |
6580 | 1093 function call might be undefined if the input arguments are not |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1094 integers, or if one of the arguments is zero, or if the input is complex |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1095 and a real value was expected. Therefore, oct-files often need additional |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1096 input parameter checking. |
6580 | 1097 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1098 There are several functions within Octave that can be useful for the |
6593 | 1099 purposes of parameter checking. These include the methods of the |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1100 octave_value class like @code{is_real_matrix}, @code{is_numeric_type}, etc. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1101 Often, with a knowledge of the Octave m-file language, you can guess at what |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1102 the corresponding C++ routine will. In addition there are some more |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1103 specialized input validation functions of which a few are demonstrated below. |
6580 | 1104 |
9906 | 1105 @example |
1106 @EXAMPLEFILE(paramdemo.cc) | |
1107 @end example | |
6580 | 1108 |
1109 @noindent | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1110 An example of its use is: |
6580 | 1111 |
1112 @example | |
1113 @group | |
1114 paramdemo ([1, 2, NaN, Inf]) | |
1115 @result{} Properties of input array: | |
1116 includes Inf or NaN values | |
1117 includes other values than 1 and 0 | |
1118 includes only int, Inf or NaN values | |
1119 @end group | |
1120 @end example | |
6569 | 1121 |
1122 @node Exception and Error Handling in Oct-Files | |
1123 @subsection Exception and Error Handling in Oct-Files | |
1124 | |
1125 Another important feature of Octave is its ability to react to the user | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1126 typing @key{Control-C} even during calculations. This ability is based on the |
6569 | 1127 C++ exception handler, where memory allocated by the C++ new/delete |
6571 | 1128 methods are automatically released when the exception is treated. When |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1129 writing an oct-file, to allow Octave to treat the user typing @key{Control-C}, |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1130 the @w{@code{OCTAVE_QUIT}} macro is supplied. For example: |
6569 | 1131 |
1132 @example | |
1133 @group | |
6577 | 1134 for (octave_idx_type i = 0; i < a.nelem (); i++) |
1135 @{ | |
1136 OCTAVE_QUIT; | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1137 b.elem (i) = 2. * a.elem (i); |
6577 | 1138 @} |
6569 | 1139 @end group |
1140 @end example | |
1141 | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1142 The presence of the @w{@code{OCTAVE_QUIT}} macro in the inner loop allows |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1143 Octave to treat the user request with the @key{Control-C}. Without this macro, |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1144 the user must either wait for the function to return before the interrupt is |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1145 processed, or press @key{Control-C} three times to force Octave to exit. |
6569 | 1146 |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1147 The @w{@code{OCTAVE_QUIT}} macro does impose a very small speed penalty, and so |
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1148 for loops that are known to be small it might not make sense to include |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1149 @w{@code{OCTAVE_QUIT}}. |
6569 | 1150 |
1151 When creating an oct-file that uses an external libraries, the function | |
1152 might spend a significant portion of its time in the external | |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1153 library. It is not generally possible to use the @w{@code{OCTAVE_QUIT}} macro |
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1154 in this case. The alternative in this case is |
6569 | 1155 |
1156 @example | |
1157 @group | |
6577 | 1158 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; |
1159 @dots{} some code that calls a "foreign" function @dots{} | |
1160 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; | |
6569 | 1161 @end group |
1162 @end example | |
1163 | |
1164 The disadvantage of this is that if the foreign code allocates any | |
1165 memory internally, then this memory might be lost during an interrupt, | |
6571 | 1166 without being deallocated. Therefore, ideally Octave itself should |
6569 | 1167 allocate any memory that is needed by the foreign code, with either the |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9906
diff
changeset
|
1168 @nospell{fortran_vec} method or the @w{@code{OCTAVE_LOCAL_BUFFER}} macro. |
6569 | 1169 |
15684
ddc651eecf7a
Fix Info index for language statements (bug #37787)
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
1170 The Octave unwind_protect mechanism (@ref{The unwind_protect Statement}) |
6571 | 1171 can also be used in oct-files. In conjunction with the exception |
6569 | 1172 handling of Octave, it is important to enforce that certain code is run |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1173 to allow variables, etc.@: to be restored even if an exception occurs. An |
6569 | 1174 example of the use of this mechanism is |
1175 | |
9906 | 1176 @example |
1177 @EXAMPLEFILE(unwinddemo.cc) | |
1178 @end example | |
6569 | 1179 |
10828
322f43e0e170
Grammarcheck .txi documentation files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
1180 As can be seen in the example: |
6569 | 1181 |
1182 @example | |
1183 @group | |
6572 | 1184 unwinddemo (1, 0) |
6569 | 1185 @result{} Inf |
1186 1 / 0 | |
1187 @result{} warning: division by zero | |
6593 | 1188 Inf |
6569 | 1189 @end group |
1190 @end example | |
1191 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1192 The warning for division by zero (and in fact all warnings) are disabled in the |
6569 | 1193 @code{unwinddemo} function. |
1194 | |
1195 @node Documentation and Test of Oct-Files | |
1196 @subsection Documentation and Test of Oct-Files | |
1197 | |
6580 | 1198 The documentation of an oct-file is the fourth string parameter of the |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1199 @w{@code{DEFUN_DLD}} macro. This string can be formatted in the same manner |
17097
e7a059a9a644
doc: Use XREF as anchor prefix in documentation for clearer results in Info viewer.
Rik <rik@octave.org>
parents:
16867
diff
changeset
|
1200 as the help strings for user functions (@pxref{Documentation Tips}), |
6580 | 1201 however there are some issue that are particular to the formatting of |
1202 help strings within oct-files. | |
1203 | |
1204 The major issue is that the help string will typically be longer than a | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1205 single line of text, and so the formatting of long help strings needs to |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1206 be taken into account. There are several possible solutions, but the most |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1207 common is illustrated in the following example, |
6580 | 1208 |
1209 @example | |
1210 @group | |
1211 DEFUN_DLD (do_what_i_want, args, nargout, | |
1212 "-*- texinfo -*-\n\ | |
1213 @@deftypefn @{Function File@} @{@} do_what_i_say (@@var@{n@})\n\ | |
7081 | 1214 A function that does what the user actually wants rather\n\ |
1215 than what they requested.\n\ | |
6580 | 1216 @@end deftypefn") |
1217 @{ | |
1218 @dots{} | |
1219 @} | |
1220 @end group | |
1221 @end example | |
1222 | |
1223 @noindent | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1224 where, as can be seen, each line of text is terminated by @code{\n\} |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1225 which is an embedded new-line in the string together with a C++ string |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1226 continuation character. Note that the final @code{\} must be the last |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1227 character on the line. |
6580 | 1228 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1229 Octave also includes the ability to embed test and demonstration |
17097
e7a059a9a644
doc: Use XREF as anchor prefix in documentation for clearer results in Info viewer.
Rik <rik@octave.org>
parents:
16867
diff
changeset
|
1230 code for a function within the code itself (@pxref{Test and Demo Functions}). |
6580 | 1231 This can be used from within oct-files (or in fact any file) with |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1232 certain provisos. First, the test and demo functions of Octave look |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1233 for @code{%!} as the first two characters of a line to identify test |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1234 and demonstration code. This is a requirement for oct-files as well. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1235 In addition, the test and demonstration code must be wrapped in a comment |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1236 block to avoid it being interpreted by the compiler. Finally, the Octave |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1237 test and demonstration code must have access to the original source code |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1238 of the oct-file and not just the compiled code as the tests are stripped |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1239 from the compiled code. An example in an oct-file might be |
6580 | 1240 |
1241 @example | |
1242 @group | |
1243 /* | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1244 %!assert (sin ([1,2]), [sin(1),sin(2)]) |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1245 %!error (sin ()) |
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1246 %!error (sin (1,1)) |
6580 | 1247 */ |
1248 @end group | |
1249 @end example | |
6569 | 1250 |
6593 | 1251 @c @node Application Programming Interface for Oct-Files |
1252 @c @subsection Application Programming Interface for Oct-Files | |
1253 @c | |
1254 @c WRITE ME, using Coda section 1.3 as a starting point. | |
6569 | 1255 |
1256 @node Mex-Files | |
1257 @section Mex-Files | |
1258 @cindex mex-files | |
1259 @cindex mex | |
1260 | |
1261 Octave includes an interface to allow legacy mex-files to be compiled | |
11573
6f8ffe2c6f76
Grammarcheck txi files for 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
1262 and used with Octave. This interface can also be used to share code |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1263 between Octave and @sc{matlab} users. However, as mex-files expose |
11573
6f8ffe2c6f76
Grammarcheck txi files for 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
1264 @sc{matlab}'s internal API, and the internal structure of Octave is |
11479
746609dd54fd
Remove Matlab euphemisms in docs and use @file macro for filenames
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
10846
diff
changeset
|
1265 different, a mex-file can never have the same performance in Octave as |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1266 the equivalent oct-file. In particular, to support the manner in which |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1267 variables are passed to mex functions there are a significant number of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1268 additional copies of memory blocks when calling or returning from a |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1269 mex-file function. For this reason, it is recommended that any new code |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1270 be written with the oct-file interface previously discussed. |
6569 | 1271 |
1272 @menu | |
17152
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1273 * Getting Started with Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1274 * Working with Matrices and Arrays in Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1275 * Character Strings in Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1276 * Cell Arrays with Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1277 * Structures with Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1278 * Sparse Matrices with Mex-Files:: |
f2a8592b8fbd
doc: Shorten some long subsection names in Manual.
Rik <rik@octave.org>
parents:
17097
diff
changeset
|
1279 * Calling Other Functions in Mex-Files:: |
6593 | 1280 @c * Application Programming Interface for Mex-Files:: |
6569 | 1281 @end menu |
1282 | |
1283 @node Getting Started with Mex-Files | |
1284 @subsection Getting Started with Mex-Files | |
1285 | |
11479
746609dd54fd
Remove Matlab euphemisms in docs and use @file macro for filenames
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
10846
diff
changeset
|
1286 The basic command to build a mex-file is either @code{mkoctfile --mex} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1287 or @code{mex}. The first command can be used either from within Octave or from |
11573
6f8ffe2c6f76
Grammarcheck txi files for 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
1288 the command line. However, to avoid issues with @sc{matlab}'s own @code{mex} |
11479
746609dd54fd
Remove Matlab euphemisms in docs and use @file macro for filenames
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
10846
diff
changeset
|
1289 command, the use of the command @code{mex} is limited to within Octave. |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1290 Compiled mex-files have the extension @file{.mex}. |
6569 | 1291 |
1292 @DOCSTRING(mex) | |
1293 | |
1294 @DOCSTRING(mexext) | |
1295 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1296 Consider the following short example: |
6569 | 1297 |
9906 | 1298 @example |
1299 @group | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1300 @EXAMPLEFILE(myhello.c) |
9906 | 1301 @end group |
1302 @end example | |
6569 | 1303 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1304 The first line @code{#include "mex.h"} makes available all of the definitions |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1305 necessary for a mex-file. One important difference between Octave and |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1306 @sc{matlab} is that the header file @qcode{"matrix.h"} is implicitly included |
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1307 through the inclusion of @qcode{"mex.h"}. This is necessary to avoid a conflict |
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1308 with the Octave file @qcode{"Matrix.h"} for operating systems and compilers that |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1309 don't distinguish between filenames in upper and lower case. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1310 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1311 The entry point into the mex-file is defined by @code{mexFunction}. The |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1312 function takes four arguments: |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1313 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1314 @enumerate 1 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1315 @item The number of return arguments (# of left-hand side args). |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1316 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1317 @item An array of pointers to return arguments. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1318 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1319 @item The number of input arguments (# of right-hand side args). |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1320 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1321 @item An array of pointers to input arguments. |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1322 @end enumerate |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1323 |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1324 Note that the function name definition is not explicitly included in |
6580 | 1325 @code{mexFunction} and so there can only be a single @code{mexFunction} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1326 entry point per file. Instead, the name of the function as seen in Octave is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1327 determined by the name of the mex-file itself minus the extension. Therefore, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1328 if the above function is in the file @file{myhello.c}, it can be compiled with |
6580 | 1329 |
1330 @example | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1331 mkoctfile --mex myhello.c |
6580 | 1332 @end example |
1333 | |
1334 @noindent | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1335 which creates a file @file{myhello.mex}. The function can then be run from |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1336 Octave as |
6580 | 1337 |
1338 @example | |
1339 @group | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1340 myhello (1,2,3) |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1341 @result{} Hello, World! |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1342 @result{} I have 3 inputs and 0 outputs |
6580 | 1343 @end group |
1344 @end example | |
1345 | |
1346 It should be noted that the mex-file contains no help string for the | |
6593 | 1347 functions it contains. To document mex-files, there should exist an |
1348 m-file in the same directory as the mex-file itself. Taking the above as | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1349 an example, we would therefore have a file @file{myhello.m} that might |
6580 | 1350 contain the text |
1351 | |
1352 @example | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1353 %MYHELLO Simple test of the functionality of a mex-file. |
6580 | 1354 @end example |
1355 | |
1356 In this case, the function that will be executed within Octave will be | |
1357 given by the mex-file, while the help string will come from the | |
6593 | 1358 m-file. This can also be useful to allow a sample implementation of the |
6580 | 1359 mex-file within the Octave language itself for testing purposes. |
1360 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1361 Although there cannot be multiple entry points in a single mex-file, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1362 one can use the @code{mexFunctionName} function to determine what name |
6593 | 1363 the mex-file was called with. This can be used to alter the behavior of |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1364 the mex-file based on the function name. For example, if |
6580 | 1365 |
9906 | 1366 @example |
1367 @group | |
1368 @EXAMPLEFILE(myfunc.c) | |
1369 @end group | |
1370 @end example | |
6580 | 1371 |
1372 @noindent | |
1373 is in file @file{myfunc.c}, and it is compiled with | |
1374 | |
1375 @example | |
1376 @group | |
1377 mkoctfile --mex myfunc.c | |
1378 ln -s myfunc.mex myfunc2.mex | |
1379 @end group | |
1380 @end example | |
1381 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1382 @noindent |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1383 then as can be seen by |
6580 | 1384 |
1385 @example | |
1386 @group | |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1387 myfunc () |
6580 | 1388 @result{} You called function: myfunc |
1389 This is the principal function | |
14846
460a3c6d8bf1
maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
1390 myfunc2 () |
6580 | 1391 @result{} You called function: myfunc2 |
1392 @end group | |
1393 @end example | |
1394 | |
1395 @noindent | |
1396 the behavior of the mex-file can be altered depending on the functions | |
1397 name. | |
1398 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1399 Although the user should only include @file{mex.h} in their code, Octave |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1400 declares additional functions, typedefs, etc., available to the user to |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1401 write mex-files in the headers @file{mexproto.h} and @file{mxarray.h}. |
6593 | 1402 |
6580 | 1403 @node Working with Matrices and Arrays in Mex-Files |
1404 @subsection Working with Matrices and Arrays in Mex-Files | |
1405 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1406 The basic mex type of all variables is @code{mxArray}. Any object, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1407 such as a matrix, cell array, or structure is stored in this basic |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1408 type. As such, @code{mxArray} serves basically the same purpose as the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1409 octave_value class in oct-files in that it acts as a container for the |
6580 | 1410 more specialized types. |
1411 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1412 The @code{mxArray} structure contains at a minimum, the name of the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1413 variable it represents, its dimensions, its type, and whether the variable is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1414 real or complex. It can also contain a number of additional fields |
6593 | 1415 depending on the type of the @code{mxArray}. There are a number of |
1416 functions to create @code{mxArray} structures, including | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1417 @code{mxCreateDoubleMatrix}, @code{mxCreateCellArray}, @code{mxCreateSparse}, |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1418 and the generic @code{mxCreateNumericArray}. |
6593 | 1419 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1420 The basic function to access the data contained in an array is |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1421 @code{mxGetPr}. As the mex interface assumes that real and imaginary |
6939 | 1422 parts of a complex array are stored separately, there is an equivalent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1423 function @code{mxGetPi} that gets the imaginary part. Both of these |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1424 functions are only for use with double precision matrices. The generic |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1425 functions @code{mxGetData} and @code{mxGetImagData} perform the same operation |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1426 on all matrix types. For example: |
6593 | 1427 |
1428 @example | |
1429 @group | |
1430 mxArray *m; | |
6686 | 1431 mwSize *dims; |
6593 | 1432 UINT32_T *pr; |
1433 | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1434 dims = (mwSize *) mxMalloc (2 * sizeof (mwSize)); |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1435 dims[0] = 2; dims[1] = 2; |
6593 | 1436 m = mxCreateNumericArray (2, dims, mxUINT32_CLASS, mxREAL); |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1437 pr = (UINT32_T *) mxGetData (m); |
6593 | 1438 @end group |
1439 @end example | |
1440 | |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1441 There are also the functions @code{mxSetPr}, etc., that perform the |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1442 inverse, and set the data of an array to use the block of memory pointed |
6593 | 1443 to by the argument of @code{mxSetPr}. |
1444 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1445 Note the type @code{mwSize} used above, and also @code{mwIndex}, are defined |
6686 | 1446 as the native precision of the indexing in Octave on the platform on |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1447 which the mex-file is built. This allows both 32- and 64-bit platforms |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1448 to support mex-files. @code{mwSize} is used to define array dimensions |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1449 and the maximum number or elements, while @code{mwIndex} is used to define |
6686 | 1450 indexing into arrays. |
1451 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1452 An example that demonstrates how to work with arbitrary real or complex |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1453 double precision arrays is given by the file @file{mypow2.c} shown below. |
6593 | 1454 |
9906 | 1455 @example |
1456 @EXAMPLEFILE(mypow2.c) | |
1457 @end example | |
6593 | 1458 |
1459 @noindent | |
1460 with an example of its use | |
1461 | |
1462 @example | |
1463 @group | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1464 b = randn (4,1) + 1i * randn (4,1); |
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1465 all (b.^2 == mypow2 (b)) |
6593 | 1466 @result{} 1 |
1467 @end group | |
1468 @end example | |
1469 | |
7096 | 1470 The example above uses the functions @code{mxGetDimensions}, |
1471 @code{mxGetNumberOfElements}, and @code{mxGetNumberOfDimensions} to work | |
1472 with the dimensions of multi-dimensional arrays. The functions | |
1473 @code{mxGetM}, and @code{mxGetN} are also available to find the number | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1474 of rows and columns in a 2-D matrix. |
6580 | 1475 |
1476 @node Character Strings in Mex-Files | |
1477 @subsection Character Strings in Mex-Files | |
1478 | |
6593 | 1479 As mex-files do not make the distinction between single and double |
1480 quoted strings within Octave, there is perhaps less complexity in the | |
1481 use of strings and character matrices in mex-files. An example of their | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1482 use that parallels the demo in @file{stringdemo.cc} is given in the |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1483 file @file{mystring.c}, as shown below. |
6593 | 1484 |
9906 | 1485 @example |
1486 @EXAMPLEFILE(mystring.c) | |
1487 @end example | |
6593 | 1488 |
1489 @noindent | |
1490 An example of its expected output is | |
1491 | |
1492 @example | |
1493 @group | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1494 mystring (["First String"; "Second String"]) |
6593 | 1495 @result{} s1 = Second String |
1496 First String | |
1497 @end group | |
1498 @end example | |
1499 | |
7096 | 1500 Other functions in the mex interface for handling character strings are |
1501 @code{mxCreateString}, @code{mxArrayToString}, and | |
1502 @code{mxCreateCharMatrixFromStrings}. In a mex-file, a character string | |
1503 is considered to be a vector rather than a matrix. This is perhaps an | |
1504 arbitrary distinction as the data in the mxArray for the matrix is | |
1505 consecutive in any case. | |
6580 | 1506 |
1507 @node Cell Arrays with Mex-Files | |
1508 @subsection Cell Arrays with Mex-Files | |
6569 | 1509 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1510 One can perform exactly the same operations on Cell arrays in mex-files |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1511 as in oct-files. An example that reduplicates the function of |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1512 the @file{celldemo.cc} oct-file in a mex-file is given by @file{mycell.c} |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1513 as shown below. |
6593 | 1514 |
9906 | 1515 @example |
1516 @EXAMPLEFILE(mycell.c) | |
1517 @end example | |
6593 | 1518 |
1519 @noindent | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1520 The output is identical to the oct-file version as well. |
6593 | 1521 |
1522 @example | |
1523 @group | |
1524 [b1, b2, b3] = mycell (@{1, [1, 2], "test"@}) | |
1525 @result{} | |
1526 b1 = 1 | |
1527 b2 = | |
1528 | |
1529 1 2 | |
1530 | |
1531 b3 = test | |
1532 @end group | |
1533 @end example | |
1534 | |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1535 Note in the example the use of the @code{mxDuplicateArray} function. This |
6593 | 1536 is needed as the @code{mxArray} pointer returned by @code{mxGetCell} |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1537 might be deallocated. The inverse function to @code{mxGetCell}, used for |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1538 setting Cell values, is @code{mxSetCell} and is defined as |
6593 | 1539 |
1540 @example | |
1541 void mxSetCell (mxArray *ptr, int idx, mxArray *val); | |
1542 @end example | |
1543 | |
7007 | 1544 Finally, to create a cell array or matrix, the appropriate functions are |
6593 | 1545 |
1546 @example | |
1547 @group | |
1548 mxArray *mxCreateCellArray (int ndims, const int *dims); | |
1549 mxArray *mxCreateCellMatrix (int m, int n); | |
1550 @end group | |
1551 @end example | |
6569 | 1552 |
6572 | 1553 @node Structures with Mex-Files |
1554 @subsection Structures with Mex-Files | |
6569 | 1555 |
6593 | 1556 The basic function to create a structure in a mex-file is |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1557 @code{mxCreateStructMatrix} which creates a structure array with a two |
6593 | 1558 dimensional matrix, or @code{mxCreateStructArray}. |
1559 | |
1560 @example | |
1561 @group | |
7081 | 1562 mxArray *mxCreateStructArray (int ndims, int *dims, |
1563 int num_keys, | |
6593 | 1564 const char **keys); |
7081 | 1565 mxArray *mxCreateStructMatrix (int rows, int cols, |
1566 int num_keys, | |
6593 | 1567 const char **keys); |
1568 @end group | |
1569 @end example | |
1570 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1571 Accessing the fields of the structure can then be performed with |
6593 | 1572 @code{mxGetField} and @code{mxSetField} or alternatively with the |
1573 @code{mxGetFieldByNumber} and @code{mxSetFieldByNumber} functions. | |
1574 | |
1575 @example | |
1576 @group | |
7081 | 1577 mxArray *mxGetField (const mxArray *ptr, mwIndex index, |
1578 const char *key); | |
6593 | 1579 mxArray *mxGetFieldByNumber (const mxArray *ptr, |
6686 | 1580 mwIndex index, int key_num); |
1581 void mxSetField (mxArray *ptr, mwIndex index, | |
6593 | 1582 const char *key, mxArray *val); |
6686 | 1583 void mxSetFieldByNumber (mxArray *ptr, mwIndex index, |
6593 | 1584 int key_num, mxArray *val); |
1585 @end group | |
1586 @end example | |
1587 | |
1588 A difference between the oct-file interface to structures and the | |
1589 mex-file version is that the functions to operate on structures in | |
1590 mex-files directly include an @code{index} over the elements of the | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1591 arrays of elements per @code{field}; Whereas, the oct-file structure |
6593 | 1592 includes a Cell Array per field of the structure. |
1593 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1594 An example that demonstrates the use of structures in a mex-file can be |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1595 found in the file @file{mystruct.c} shown below. |
6580 | 1596 |
9906 | 1597 @example |
1598 @EXAMPLEFILE(mystruct.c) | |
1599 @end example | |
6580 | 1600 |
6593 | 1601 An example of the behavior of this function within Octave is then |
1602 | |
1603 @example | |
7081 | 1604 a(1).f1 = "f11"; a(1).f2 = "f12"; |
1605 a(2).f1 = "f21"; a(2).f2 = "f22"; | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1606 b = mystruct (a) |
6593 | 1607 @result{} field f1(0) = f11 |
1608 field f1(1) = f21 | |
1609 field f2(0) = f12 | |
1610 field f2(1) = f22 | |
1611 b = | |
1612 @{ | |
1613 this = | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1614 |
6593 | 1615 (, |
1616 [1] = this1 | |
1617 [2] = this2 | |
1618 [3] = this3 | |
1619 [4] = this4 | |
1620 ,) | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1621 |
6593 | 1622 that = |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1623 |
6593 | 1624 (, |
1625 [1] = that1 | |
1626 [2] = that2 | |
1627 [3] = that3 | |
1628 [4] = that4 | |
1629 ,) | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17152
diff
changeset
|
1630 |
6593 | 1631 @} |
1632 @end example | |
6569 | 1633 |
1634 @node Sparse Matrices with Mex-Files | |
1635 @subsection Sparse Matrices with Mex-Files | |
1636 | |
6593 | 1637 The Octave format for sparse matrices is identical to the mex format in |
7001 | 1638 that it is a compressed column sparse format. Also in both, sparse |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9080
diff
changeset
|
1639 matrices are required to be two-dimensional. The only difference is that |
6939 | 1640 the real and imaginary parts of the matrix are stored separately. |
6593 | 1641 |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1642 The mex-file interface, in addition to using @code{mxGetM}, @code{mxGetN}, |
6593 | 1643 @code{mxSetM}, @code{mxSetN}, @code{mxGetPr}, @code{mxGetPi}, |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1644 @code{mxSetPr}, and @code{mxSetPi}, also supplies the following functions. |
6593 | 1645 |
1646 @example | |
1647 @group | |
6686 | 1648 mwIndex *mxGetIr (const mxArray *ptr); |
1649 mwIndex *mxGetJc (const mxArray *ptr); | |
1650 mwSize mxGetNzmax (const mxArray *ptr); | |
6593 | 1651 |
6686 | 1652 void mxSetIr (mxArray *ptr, mwIndex *ir); |
1653 void mxSetJc (mxArray *ptr, mwIndex *jc); | |
1654 void mxSetNzmax (mxArray *ptr, mwSize nzmax); | |
6593 | 1655 @end group |
1656 @end example | |
6580 | 1657 |
6593 | 1658 @noindent |
1659 @code{mxGetNzmax} gets the maximum number of elements that can be stored | |
1660 in the sparse matrix. This is not necessarily the number of non-zero | |
1661 elements in the sparse matrix. @code{mxGetJc} returns an array with one | |
1662 additional value than the number of columns in the sparse matrix. The | |
1663 difference between consecutive values of the array returned by | |
1664 @code{mxGetJc} define the number of non-zero elements in each column of | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1665 the sparse matrix. Therefore, |
6580 | 1666 |
6593 | 1667 @example |
1668 @group | |
6686 | 1669 mwSize nz, n; |
1670 mwIndex *Jc; | |
6593 | 1671 mxArray *m; |
1672 @dots{} | |
1673 n = mxGetN (m); | |
1674 Jc = mxGetJc (m); | |
1675 nz = Jc[n]; | |
1676 @end group | |
1677 @end example | |
1678 | |
1679 @noindent | |
1680 returns the actual number of non-zero elements stored in the matrix in | |
1681 @code{nz}. As the arrays returned by @code{mxGetPr} and @code{mxGetPi} | |
1682 only contain the non-zero values of the matrix, we also need a pointer | |
1683 to the rows of the non-zero elements, and this is given by | |
1684 @code{mxGetIr}. A complete example of the use of sparse matrices in | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1685 mex-files is given by the file @file{mysparse.c} shown below. |
6593 | 1686 |
9906 | 1687 @example |
1688 @EXAMPLEFILE(mysparse.c) | |
1689 @end example | |
6569 | 1690 |
6580 | 1691 @node Calling Other Functions in Mex-Files |
1692 @subsection Calling Other Functions in Mex-Files | |
1693 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1694 It is possible to call other Octave functions from within a mex-file |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1695 using @code{mexCallMATLAB}. An example of the use of @code{mexCallMATLAB} |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1696 can be see in the example below. |
6580 | 1697 |
9906 | 1698 @example |
1699 @EXAMPLEFILE(myfeval.c) | |
1700 @end example | |
6580 | 1701 |
1702 If this code is in the file @file{myfeval.c}, and is compiled to | |
1703 @file{myfeval.mex}, then an example of its use is | |
6569 | 1704 |
6580 | 1705 @example |
1706 @group | |
14856
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1707 myfeval ("sin", 1) |
c3fd61c59e9c
maint: Use Octave coding conventions for cuddling parentheses in doc directory
Rik <octave@nomad.inbox5.com>
parents:
14846
diff
changeset
|
1708 a = myfeval ("sin", 1) |
6580 | 1709 @result{} Hello, World! |
1710 I have 2 inputs and 1 outputs | |
1711 I'm going to call the interpreter function sin | |
1712 a = 0.84147 | |
1713 @end group | |
1714 @end example | |
1715 | |
1716 Note that it is not possible to use function handles or inline functions | |
1717 within a mex-file. | |
1718 | |
6593 | 1719 @c @node Application Programming Interface for Mex-Files |
1720 @c @subsection Application Programming Interface for Mex-Files | |
1721 @c | |
1722 @c WRITE ME, refer to mex.h and mexproto.h | |
6569 | 1723 |
1724 @node Standalone Programs | |
1725 @section Standalone Programs | |
1726 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1727 The libraries Octave itself uses can be utilized in standalone |
11573
6f8ffe2c6f76
Grammarcheck txi files for 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
1728 applications. These applications then have access, for example, to the |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1729 array and matrix classes, as well as to all of the Octave algorithms. The |
11479
746609dd54fd
Remove Matlab euphemisms in docs and use @file macro for filenames
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
10846
diff
changeset
|
1730 following C++ program, uses class Matrix from @file{liboctave.a} or |
746609dd54fd
Remove Matlab euphemisms in docs and use @file macro for filenames
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents:
10846
diff
changeset
|
1731 @file{liboctave.so}. |
6569 | 1732 |
9906 | 1733 @example |
1734 @EXAMPLEFILE(standalone.cc) | |
1735 @end example | |
6569 | 1736 |
6580 | 1737 @noindent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1738 mkoctfile can be used to build a standalone application with a |
6569 | 1739 command like |
1740 | |
1741 @example | |
1742 @group | |
8097
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1743 $ mkoctfile --link-stand-alone standalone.cc -o standalone |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1744 $ ./standalone |
6569 | 1745 Hello Octave world! |
1746 11 12 | |
1747 21 22 | |
1748 $ | |
1749 @end group | |
1750 @end example | |
1751 | |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1752 Note that the application @code{standalone} will be dynamically linked |
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1753 against the Octave libraries and any Octave support libraries. The above |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1754 allows the Octave math libraries to be used by an application. It does |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1755 not, however, allow the script files, oct-files, or builtin functions of |
9080
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1756 Octave to be used by the application. To do that the Octave interpreter |
ec41eabf4499
Cleanup documentation files dynamic.texi, testfun.texi, tips.texi
Rik <rdrider0-list@yahoo.com>
parents:
9038
diff
changeset
|
1757 needs to be initialized first. An example of how to do this can then be |
8097
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1758 seen in the code |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1759 |
9906 | 1760 @example |
1761 @EXAMPLEFILE(embedded.cc) | |
1762 @end example | |
8097
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1763 |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1764 @noindent |
16867
be41c30bcb44
Re-write documentation and all examples of dynamically linked functions.
Rik <rik@octave.org>
parents:
16483
diff
changeset
|
1765 which, as before, is compiled and run as a standalone application with |
8097
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1766 |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1767 @example |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1768 @group |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1769 $ mkoctfile --link-stand-alone embedded.cc -o embedded |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1770 $ ./embedded |
16483
fcf1b0b52083
Use a better example of gcd() in embedded.cc
Rik <rik@octave.org>
parents:
16482
diff
changeset
|
1771 GCD of [10, 15] is 5 |
8097
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1772 $ |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1773 @end group |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1774 @end example |
804c60f92fb1
Add explanationation of initializing the interpreter in a standalone program
David Bateman <dbateman@free.fr>
parents:
7354
diff
changeset
|
1775 |
18075
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1776 It is worth noting that, if only builtin functions are to be called from |
17949
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1777 a C++ standalone program, then it does not need to initialize the |
18075
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1778 interpreter to do so. The general rule is that, for a builtin |
17949
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1779 function named @code{function_name} in the interpreter, there will be |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1780 a C++ function named @code{Ffunction_name} (note the prepended capital |
18075
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1781 @code{F}) accessible in the C++ API@. The declarations for all builtin |
17949
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1782 functions are collected in the header file @code{builtin-defun-decls.h}. |
18075
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1783 This feature should be used with care as the list of built-in functions can |
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1784 change. No guarantees can be made that a function that is currently built in |
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1785 won't be implemented as a .m file or as a dynamically linked function in the |
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1786 future. An example of how to call builtin functions from C++ can be seen in the |
24759ac2b8cb
doc: Periodic spellcheck of documentation
Rik <rik@octave.org>
parents:
17949
diff
changeset
|
1787 code |
17949
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1788 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1789 @example |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1790 @EXAMPLEFILE(standalonebuiltin.cc) |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1791 @end example |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1792 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1793 @noindent |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1794 which, again, is compiled and run as a standalone application with |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1795 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1796 @example |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1797 @group |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1798 $ mkoctfile --link-stand-alone standalonebuiltin.cc -o standalonebuiltin |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1799 $ ./standalonebuiltin |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1800 This is a matrix: |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1801 11 12 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1802 21 22 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1803 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1804 This is the norm of the matrix: |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1805 34.4952 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1806 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1807 @end group |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1808 @end example |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1809 |
3341d2f1e5db
Document calling DEFUN functions in C++.
Carlo de Falco <cdf@users.sourceforge.net>
parents:
17744
diff
changeset
|
1810 |