File: Calling-Octave-Functions-from-Oct_002dFiles.html

package info (click to toggle)
octave 3.8.2-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 84,396 kB
  • ctags: 45,547
  • sloc: cpp: 293,356; ansic: 42,041; fortran: 23,669; sh: 13,629; objc: 7,890; yacc: 7,093; lex: 3,442; java: 2,125; makefile: 1,589; perl: 1,009; awk: 974; xml: 34
file content (168 lines) | stat: -rw-r--r-- 7,081 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Octave: Calling Octave Functions from Oct-Files</title>

<meta name="description" content="GNU Octave: Calling Octave Functions from Oct-Files">
<meta name="keywords" content="GNU Octave: Calling Octave Functions from Oct-Files">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Oct_002dFiles.html#Oct_002dFiles" rel="up" title="Oct-Files">
<link href="Calling-External-Code-from-Oct_002dFiles.html#Calling-External-Code-from-Oct_002dFiles" rel="next" title="Calling External Code from Oct-Files">
<link href="Accessing-Global-Variables-in-Oct_002dFiles.html#Accessing-Global-Variables-in-Oct_002dFiles" rel="prev" title="Accessing Global Variables in Oct-Files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>


</head>

<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Calling-Octave-Functions-from-Oct_002dFiles"></a>
<div class="header">
<p>
Next: <a href="Calling-External-Code-from-Oct_002dFiles.html#Calling-External-Code-from-Oct_002dFiles" accesskey="n" rel="next">Calling External Code from Oct-Files</a>, Previous: <a href="Accessing-Global-Variables-in-Oct_002dFiles.html#Accessing-Global-Variables-in-Oct_002dFiles" accesskey="p" rel="prev">Accessing Global Variables in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Calling-Octave-Functions-from-Oct_002dFiles-1"></a>
<h4 class="subsection">A.1.8 Calling Octave Functions from Oct-Files</h4>

<p>There is often a need to be able to call another Octave function from
within an oct-file, and there are many examples of such within Octave
itself.  For example, the <code>quad</code> function is an oct-file that
calculates the definite integral by quadrature over a user supplied
function.
</p>
<p>There are also many ways in which a function might be passed.  It might
be passed as one of
</p>
<ol>
<li> Function Handle

</li><li> Anonymous Function Handle

</li><li> Inline Function

</li><li> String
</li></ol>

<p>The example below demonstrates an example that accepts all four means of
passing a function to an oct-file.
</p>
<div class="example">
<pre class="verbatim">#include &lt;octave/oct.h&gt;
#include &lt;octave/parse.h&gt;

DEFUN_DLD (funcdemo, args, nargout, &quot;Function Demo&quot;)
{
  octave_value_list retval;
  int nargin = args.length ();

  if (nargin &lt; 2)
    print_usage ();
  else
    {
      octave_value_list newargs;
      for (octave_idx_type i = nargin - 1; i &gt; 0; i--)
        newargs(i-1) = args(i);
      if (args(0).is_function_handle () || args(0).is_inline_function ())
        {
          octave_function *fcn = args(0).function_value ();
          if (! error_state)
            retval = feval (fcn, newargs, nargout);
        }
      else if (args(0).is_string ())
        {
          std::string fcn = args(0).string_value ();
          if (! error_state)
            retval = feval (fcn, newargs, nargout);
        }
      else
        error (&quot;funcdemo: INPUT must be string, inline, or function handle&quot;);
    }
  return retval;
}
</pre><pre class="example">
</pre></div>

<p>The first argument to this demonstration is the user-supplied function
and the remaining arguments are all passed to the user function.
</p>
<div class="example">
<pre class="example">funcdemo (@sin,1)
&rArr; 0.84147
funcdemo (@(x) sin (x), 1)
&rArr; 0.84147
funcdemo (inline (&quot;sin (x)&quot;), 1)
&rArr; 0.84147
funcdemo (&quot;sin&quot;,1)
&rArr; 0.84147
funcdemo (@atan2, 1, 1)
&rArr; 0.78540
</pre></div>

<p>When the user function is passed as a string the treatment of the
function is different.  In some cases it is necessary to have the
user supplied function as an <code>octave_function</code> object.  In that
case the string argument can be used to create a temporary function
as demonstrated below.
</p>
<div class="example">
<pre class="example">std::octave fcn_name = unique_symbol_name (&quot;__fcn__&quot;);
std::string fcode = &quot;function y = &quot;;
fcode.append (fcn_name);
fcode.append (&quot;(x) y = &quot;);
fcn = extract_function (args(0), &quot;funcdemo&quot;, fcn_name,
                        fcode, &quot;; endfunction&quot;);
&hellip;
if (fcn_name.length ())
  clear_function (fcn_name);
</pre></div>

<p>There are two important things to know in this case.  First, the number of
input arguments to the user function is fixed, and in the above example is
a single argument.  Second, to avoid leaving the temporary function in the
Octave symbol table it should be cleared after use.  Also, by convention
internal function names begin and end with the character sequence &lsquo;<samp>__</samp>&rsquo;.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Calling-External-Code-from-Oct_002dFiles.html#Calling-External-Code-from-Oct_002dFiles" accesskey="n" rel="next">Calling External Code from Oct-Files</a>, Previous: <a href="Accessing-Global-Variables-in-Oct_002dFiles.html#Accessing-Global-Variables-in-Oct_002dFiles" accesskey="p" rel="prev">Accessing Global Variables in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>