411 REFERENCE · Wikibooks
SPM/Octave
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
GNU Octave
GNU Octave is a high-level language that is mostly compatible with MATLAB. It is free open source software under the terms of the GNU General Public License.
Octave
Octave website: https://octave.org/
Octave project: http://hg.savannah.gnu.org/hgweb/octave/
Octave Help mailing list: https://lists.gnu.org/mailman/listinfo/help-octave
Octave Maintainers mailing list: https://lists.gnu.org/mailman/listinfo/octave-maintainers
Octave bug tracker: http://savannah.gnu.org/bugs/?group=octave
Octave GitHub: https://github.com/gnu-octave
Octave-Forge: http://octave.sourceforge.net/
GNU Octave and reproducible research by John W. Eaton
MATLAB/Octave compatibility
GNU Octave is mostly compatible with MATLAB:
http://wiki.octave.org/FAQ#Differences_between_Octave_and_Matlab
https://en.wikibooks.org/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB
http://wiki.octave.org/Compatibility
Compatibility status from other neuroimaging MATLAB packages:
EEGLAB: https://sccn.ucsd.edu/wiki/Running_EEGLAB_on_Octave
FieldTrip: http://www.fieldtriptoolbox.org/faq/can_i_use_octave_instead_of_matlab/
Psychtoolbox: http://psychtoolbox.org/
Current status for SPM/Octave compatibility
SPM is currently not officially supported under Octave but many modules are effectively compatible. Feedbacks about further evaluation and validation are very welcome. In most situations, the standalone version of SPM might be a sufficient alternative.
Feel free to contact fil.spm@ucl.ac.uk if this is something you are interested in. You need to use the latest versions of SPM12 and GNU Octave (7.3).
Compilation
For compilation of the MEX files for Octave, run the following:
<nowiki>
cd /home/login/spm12/src
make PLATFORM=octave
make PLATFORM=octave install
</nowiki>
An all-in-one Octave script to download, configure and install SPM in the current directory is as follow (to be typed at the Octave prompt):
<nowiki>
%% Store current working directory
cwd = pwd;
%% Download SPM12 r7771
unzip ("https://github.com/spm/spm12/archive/r7771.zip", cwd);
%% Patch SPM12
urlwrite ("https://raw.githubusercontent.com/spm/spm-octave/main/spm12_r7771.patch", "spm12_r7771.patch");
system ("patch -p3 -d spm12-r7771 < spm12_r7771.patch");
%% Compile MEX files
cd (fullfile (cwd, "spm12-r7771", "src"));
system ("make PLATFORM=octave");
system ("make PLATFORM=octave install");
%% Add SPM12 to the function search path
addpath (fullfile (cwd, "spm12-r7771"));
cd (cwd);
%% Start SPM12
spm
</nowiki>
How to contribute
You can contribute to improve the support of SPM on GNU Octave in several ways:
Report bugs: using the development version of Octave, report problems you encounter when using SPM to SPM or Octave developers. Make sure to only report a bug in Octave when it's something that should not be fixed in SPM instead. Try to isolate the problem as much as possible.
Propose patches in Octave for bugs from the list below that have not been fixed yet.
Contribute financially to the Octave community.
Compatibility issues between SPM and Octave
Requires changes in SPM
Compilation of MEX files: use "mkoctfile --mex" and the MEX-file extension is ".mex" on all platforms.
do is a reserved keyword in Octave (for a do-until loop) so cannot be used as variable name.
disp should be called instead of display for standard variables (in OO programming).
builtin('display',obj) does not work on user-defined objects (MATLAB returns 'classname object: x-by-y', i.e. it calls disp.m).
class can only be called from the class constructor (and not in any other method function) (class(obj,'myclass') => myclass(obj)).
The short-circuit && and || operators should be used in if statements, instead of binary operators & and |. This is reported by MLINT.
MEX files should include "mex.h" but not "matrix.h", see this
cd does not return current directory in Octave (unlikely to change, see this thread). Call pwd beforehand instead.
Requires changes in Octave
It is not possible to create a function handle with a function name that does not exist (eg, x = @crash fails). fixed
Line continuation "..." does not ignore anything that appears after it, unless there is a comment sign % (MATLAB does). fixed
strrep.m works on strings but not cell arrays. fixed
isdeployed.m does not exist (function X=isdeployed, X=false;). fixed
textscan.m, strread.m and textread.m do not exist (in 3.2.4; available in devel, see this and this). Note that in MATLAB, textscan should be preferred and replace strread and textread. The devel function crashes on textscan('aaa.bbb','%s','delimiter','.') fixed
A subfunction of a private class method does not access fields directly (i.e. it's a step further from this) and calls subsref/subsasgn instead. fixed
which.m does not support the -ALL option (see this). in progress
trailing filesep in addpath/rmpath fixed
a='a';b={};c=cellfun(@(x)strcmp(a,x),b); crashes with Octave (devel, not 3.2.4) while MATLAB returns c=[]. fixed
Same error with b=get(findobj(0,'Tag','xxx'),'a') which should return [], i.e. problem with functions that return empty output. fixed
save.m (and perhaps load.m) have trouble with MATLAB binary MAT-format. (when some variables are not double precision (e.g. clear a;a.field1=single(1);save a.mat a -v6;load a.mat crashes on Octave dev ("error: load: invalid element type = 0") fixed). fixed
dialog, errordlg, helpdlg, inputdlg, listdlg, msgbox, warndlg do not exist in Octave.
gco.m now exists in Octave but creates a figure if none exists. fixed.
fcnchk.m does not exist in Octave (can usually be replaced by str2func.m)
isequal.m does not work with objects (error: find: wrong type argument `class', __isequal__.m at line 147). fixed
logm(eye(3)) crashes, MATLAB returns zeros(3). fixed
logm sometimes returns complex numbers. fixed
mat2str fails on logical inputs. fixed
Several problems with hierarchical classes. fixed, fixed, fixed, fixed, fixed, fixed, in progress
Assignment error with non-preallocated sparse matrices (clear a; a(1,:)=sparse(1,3,1,1,3); returns A(I,J,...) = X: dimensions mismatch. fixed
tic/toc do not handle input/output arguments as in MATLAB (tStart=tic; any_statements; tElapsed=toc(tStart);). fixed
str2num(',1,1') returns [1 1] in MATLAB and [] in Octave. fixed
Objects not converted as structure when loaded from a MAT-file if class definition is not in path. fixed
Accessing graphics object properties from an empty handle displays obscure warning (get([],'x')). fixed
Compatibility: save with empty variable names. fixed
Test on fileparts input argument. fixed
nargchk(1,1,1,'struct') returns a 1x1 struct with no fields in Octave and a 0x1 struct with fields message and identifier in MATLAB. fixed
[[];{'a'}] returns {[];'a'} instead of {'a'}, won't fix
Empty struct struct([]) not preserved when saved in a MAT-file. fixed
Problem in regexprep with backslash escape character. fixed
Segmentation fault with [B,C]=chol(-speye(3)). fixed
mwSignedIndex is not defined => typedef int mwSignedIndex; fixed
cell arrays of cell arrays as saved by matlabbatch are not parsed properly with Octave. fixed
mkoctfile does not recognize argument -outdir. in progress
desktop function does not exist, particularly useful for calls desktop('-inuse'). fixed
Compilation with SuiteSparse 3.2 fails. fixed
undefined symbol: mexCallMATLAB. fixed
Segmentation fault with clf.m test. fixed
W specifier in fopen does not work. fixed
Parser oddity with if statements. fixed
Problem with mxArray in MEX files. fixed
Parse error with local functions in classdef files. fixed
ind2rgb does not handle float inputs in the same way than MATLAB. fixed
Invalid conversion from string to real scalar with %c., fixed
Compilation error yylex was not declared in this scope., fixed
Compilation failure due to openGL. fixed
-depth argument in findobj., fixed
evalc is not defined. fixed
io64.h is not defined, in progress.
save function handle variables in MATLAB's binary data format, in progress
Support of close all force., fixed
warning in findobj when using regexp., fixed
Printing a figure not containing axes. fixed
Error following an error in a callback of a uimenu. fixed
SelectionType open for double-click non available (Qt-only). fixed
hgload can't open MATLAB figures, in progress
Difference with figure/uicontrol between Octave and MATLAB, in progress
Segmentation fault when loading a MAT-file containing a function_handle to a subfunction, in progress
Behaviour of figure property ToolBar when set to auto. fixed
Properties of a popupmenu uicontrol. fixed
Callback execution of an edit uicontrol. fixed
Mouse interaction with image objects don't work in fltk toolkit, in progress
Property value of checkbox uicontrol. fixed
Changing the style of a uicontrol after creation, in progress
Display of popupmenu uicontrol (Qt) in progress
Mouse click callbacks of a listbox uicontrol, in progress
Interpretation of cell array in String property of a text uicontrol. fixed
Incorrect output in textscan/strread with trailing delimiter. fixed
Failure to exit when running Octave in --no-gui mode. fixed
Freeze with drawnow. fixed
Print options: -noui, -painters, -opengl. fixed
Reset submenus of a uicontextmenu, in progress
Legend object printed below lines in plot, in progress
Order of uimenus. fixed
CreateMode argument for msgbox/errordlg/warndlg. fixed
Error no method for 'scalar struct = scalar'. fixed
Print does not preserve multiline text and TeX markup, in progress
Removing a context menu. fixed
Case-sensitive listdlg's SelectionMode values. fixed
Image display in a 3D view, in progress
Issues with copy to clipboard. fixed
Error base_graphics_object::get_properties: invalid graphics object, in progress
Visible property of a uicontextmenu. fixed
make attempts to build libgui even with --disable-gui. fixed
function localfunctions not implemented. fixed
function import not implemented, in progress
Access to object arrays, in progress
Loading a function handle from a MAT-file, in progress
Segmentation fault with missing warning state "all". fixed
corrcoef is missing. fixed
Third output of uiputfile undefined when user presses Cancel. fixed
MEX object files "*.o" are not automatically deleted after compilation (they are with MATLAB's mex). fixed
Octave buffers output, which can be blocking. fflush(stdout) or page_screen_output has to be used. pager disabled by default in 4.4
/usr/X11R6/lib/libGL.so: could not read symbols on Suse 64 bits. fixed
CHOLMOD_NOT_POSDEF was not declared in this scope. fixed
sortrows/sort: only cell arrays of character strings may be sorted error. fixed
Error in concatenation of classdef objects, in progress
Restore window button does not trigger a repaint event for its content. fixed
ginput doesn't correctly process shift/ctlr/alt key combinations.fixed
GUI Command Window could support syntax highlight, in progress
Ctrl+C doesn't interrupt and causes SIGABRT at exit. fixed
mxCreateNumericArray with zero size. fixed
Build error with mx-cdm-dm.cc. fixed
linspace() incompatibility with Matlab when N < 2. fixed
Make display of coordinates in figure's status bar optional. fixed
Crash when uicontrol's callback returns an error. fixed
Refresh when using waitfor. fixed
ButtonDownFcn callback of an image. fixed
run behaves differently from Matlab on function m-files. fixed
doc build fails with texi2dvi/texi2pdf errors on Ubuntu 14.04. fixed
Figure handle input argument for close(...,'force'). fixed
"parse error" error message in GUI callbacks. fixed
delete(allchild(fig)) in a "deletefcn" callback raises error. fixed
missing getframe function. fixed
Special characters in uicontrol's string. fixed
prefdir should not be a private function. fixed
Help menu of Qt figures. fixed
Detection of Qscintilla libraries. fixed
Root graphics property "MonitorPositions" not fully implemented, in progress
Default settings with uicontrols. fixed
Segmentation fault with Qt figures. fixed
uicontrols extent is incorrect, in progress
mexCallMATLABWithTrap not implemented. fixed
mxSetDimensions for cell arrays. fixed
realpow: produced complex result. fixed
Cannot set breakpoints in subfunctions from GUI editor when not using "endfunction" keyword, in progress
Missing MEX function mxArrayToUTF8String, in progress
Backgroundcolor ignored for pushbutton and radiobutton, in progress
Using exit() in batch mode throws octave::exit_exception. fixed
Display of images for axes partially outside a figure. fixed
uicontrol popupmenu sizing. fixed
Implementation of containers.Map. fixed
Error in the unwind_protect_cleanup section of print.m.fixed
strmatch, incompatible result on 'empty' input, in progress
Patch with zero area not displayed with OpenGL, in progress
questdlg displays buttons in reverse order. fixed
waitfor should silently accept an empty graphics handle. fixed
Segmentation fault after a caught error in an Octave script. fixed
Non-empty ouput for non-matching regexp with 'names' option. fixed
Invalid FID and fopen(FID). fixed
Matlab eval function accepts a column vector string input, in progress
__have_gnuplot__ does not return anything. fixed
uimenu 's position is sometimes 0, in progress
rotate3d compatibility with Matlab, in progress
Output of uicontrol. fixed
isequalwithequalnans is missing. fixed
fwrite input argument type. fixed
set() is case-sensitive. fixed
Update list of missing functions. fixed
sum, cumsum, etc. mishandle integer inputs, in progress
Error using print and the append flag. fixed
${cmd} replacement operator in regexprep, in progress
Position of uimenu. fixed
Loading of figures (and other objects) from Octave IDE. fixed
orderfields is slow. fixed
Undefined input to a classdef method. fixed
zeros: like keyword, in progress
textscan option MultipleDelimsAsOne does not apply to space or tab characters, in progress
ismember fails if the string ends in a space. fixed
Infinite loop in normest1. fixed
pinv(0) different from Matlab. fixed
center() relies on broadcasting. fixed
private function in classdef file. fixed
max_recursion_depth error in classdef constructor, in progress
isequal is slow. fixed
display of multidimensional arrays uses 'ans', in progress
strcmp with multidimensional char arrays, in progress
Implementation of class categorical, in progress
Support for "import" keyword, in progress
modal windowstyle property not working. fixed
Missing keyword help for classdef keywords. fixed
makeValidName and makeUniqueStrings. fixed
PDF user manual uses a backward apostrophe ` in code examples. fixed
Implementation of histcounts, in progress
Implement jsondecode, jsonencode functions, in progress
Figure property IntegerHandle does not work fully with Qt toolkit, in progress
"Number" property for figure. fixed
Implementation of movegui. fixed
Implementation of savefig. fixed
Octave 4.3.0+ can't load figures saved with previous versions, in progress
Unknown command `codequoteundirected' in help text. fixed
warning message when qcollectiongenerator and qhelpgenerator are not found. fixed
Syntax of documentation with texinfo 4.13. fixed
Segmentation fault when executing a script containing a figure. fixed
warning from opengl_renderer about light object. fixed
uicontrol/uibuttongroup: focusing not implemented yet. fixed
octave deadlocks with deletefcn callback that calls graphical function, in progress
doc: some default Qt properties are different between systems. fixed
MEX file in a private directory of a class. fixed
ismember error with mixed numeric and char arrays inputs. fixed
Error with whos -file: 'load' not found. fixed
Behavior of open with unknown or non-existing files, in progress
Colors of a uicontrol pushbutton. fixed
uipanel doesnt show border in linux. fixed
camlight (axis_handle, ...) should work for Matlab Compatibility. fixed
Implementation of isfolder. fixed
Private directory in +package, in progress
Figure's Position when MenuBar is none. fixed
load() should issue an error if specified variable does not exist in file, in progress
subsasgn call when the subscripted expression contains the end keyword, in progress
Implementation of memmapfile, in progress
File browser unresponsive, in progress
uicontrol: validation of cdata property. fixed
savefig should accept a vector of figure handles for Matlab compatibility. fixed
colormap property of a figure cannot be empty. fixed
Interpreter cannot find methods in files of classdefs in packages, in progress
Implement uicontrol focusing behavior. fixed
Use of camlight when a patch is not visible. fixed
Removal of called_from_builtin, in progress
Property VertexNormals not updated. fixed
gunzip/bunzip2 error with cell array of strings input. fixed
DOCSTRING macro does not recognize matlab.lang.makeValidName. fixed
Change of a togglebutton uicontrol's value not reflected graphically. fixed
Global variable in a MEX file, in progress
warning: popupmenu value not within valid display range. fixed
Speed issue with uicontrols, in progress
gcbf and HandleVisibility property. fixed
Add support for more types for image's cdata. fixed
Binary input image for edge, in progress
colorbar properties need listeners to invoke actions, in progress
Implementation of lightangle. fixed
[MXE Octave] lib vs lib64. fixed
Path management in the GUI, in progress
isosurface is slow. fixed
Image not displayed with YDir set to normal. fixed
Conflict between package namespace and function name, in progress
subsref called in a subscripted assignment operation, in progress
statistical CDF functions lack upper argument support, in progress
Closing plots much slower in Octave 5.1.0, in progress
dbup and dbdown not working as expected, in progress
Undecided yet
mkoctfile's option to define output file name is "-o" or "--output" while mex's option is "-output". If used, no file extension ('.mex') is appended.
computer.m returns different strings than on MATLAB (PCWIN, GLNX86, PCWIN64, GLNXA64, MACI64), e.g. x86_64-unknown-linux-gnu.
load.m and save.m automatically add a .mat file extension if not provided with MATLAB (Octave doesn't).
Miscellaneous
exist('OCTAVE_VERSION','builtin') can be used to detect if running in Octave or MATLAB.