SPM/Octave
外观
< SPM
SPM 维基教科书已移至 https://www.fil.ion.ucl.ac.uk/spm/docs/ |
GNU Octave 是一种高级语言,它与 MATLAB 大部分兼容。它是根据 GNU 通用公共许可证条款发布的免费开源软件。
- Octave 网站:https://octave.org/
- Octave 项目:http://hg.savannah.gnu.org/hgweb/octave/
- Octave 帮助邮件列表:https://lists.gnu.org/mailman/listinfo/help-octave
- Octave 维护者邮件列表:https://lists.gnu.org/mailman/listinfo/octave-maintainers
- Octave 错误追踪器:http://savannah.gnu.org/bugs/?group=octave
- Octave GitHub:https://github.com/gnu-octave
- Octave-Forge:http://octave.sourceforge.net/
- GNU Octave 和可重复研究 由 John W. Eaton 撰写
GNU Octave 与 MATLAB 大部分兼容
- http://wiki.octave.org/FAQ#Differences_between_Octave_and_Matlab
- https://wikibooks.cn/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB
- http://wiki.octave.org/Compatibility
其他神经影像 MATLAB 软件包的兼容性状态
- 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/
SPM 目前不支持在 Octave 下运行,但许多模块实际上是兼容的。欢迎提供有关进一步评估和验证的反馈。在大多数情况下,SPM 的独立版本 可能是足够可行的替代方案。
如果您对此感兴趣,请随时联系 [email protected]。您需要使用最新版本的 SPM12 和 GNU Octave (7.3)。
要编译 Octave 的 MEX 文件,请运行以下命令
cd /home/login/spm12/src make PLATFORM=octave make PLATFORM=octave install
一个在当前目录下载、配置和安装 SPM 的一体化 Octave 脚本如下(在 Octave 提示符处输入):
%% 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
您可以通过多种方式帮助改进 GNU Octave 对 SPM 的支持
- 报告错误: 使用 Octave 的开发版本,将您在使用 SPM 时遇到的问题报告给 SPM 或 Octave 开发人员。请确保仅当遇到 SPM 中不应该修复的问题时才报告 Octave 的错误。尽可能隔离问题。
- 提出补丁 用于修复以下列表中尚未修复的错误。
- 经济上支持 Octave 社区。
- MEX 文件的编译:使用"mkoctfile --mex",并且 MEX 文件扩展名为 ".mex",适用于所有平台。
- do 是 Octave 中的保留关键字(用于 do-until 循环),因此不能用作变量名。
- 对于标准变量(在 OO 编程中)应该调用disp 而不是display。
- builtin('display',obj) 不适用于用户定义的对象(MATLAB 返回 'classname object: x-by-y',即它调用 disp.m)。
- class 只能从类构造函数中调用(而不是在任何其他方法函数中调用)(class(obj,'myclass') => myclass(obj))。
- 在 if 语句中应该使用短路&& 和|| 运算符,而不是二进制运算符 & 和 |。MLINT 会报告此问题。
- MEX 文件应该包含 "mex.h" 但不应包含"matrix.h",请参阅 此处
- cd 不会在 Octave 中返回当前目录(不太可能更改,请参阅 此线程)。改用事先调用pwd。
无法使用不存在的函数名称创建函数句柄(例如,x = @crash 会失败)。已修复行继续符 "..." 不会忽略它之后出现的任何内容,除非有注释符号%(MATLAB 会)。已修复strrep.m 可以作用于字符串,但不能作用于元胞数组。已修复isdeployed.m 不存在(函数 X=isdeployed,X=false;)。已修复textscan.m、strread.m 和textread.m 不存在(在 3.2.4 中;在 devel 中可用,请参阅 此处 和 此处)。请注意,在 MATLAB 中,应优先使用 textscan 并替换 strread 和 textread。devel 函数在textscan('aaa.bbb','%s','delimiter','.') 上崩溃已修复私有类方法的子函数不会直接访问字段(即它比 此处 更进一步)并且会调用 subsref/subsasgn。已修复- which.m 不支持 -ALL 选项(请参阅 此处)。正在进行
addpath/rmpath 中的尾随filesep已修复a='a';b={};c=cellfun(@(x)strcmp(a,x),b); 在 Octave (开发版,非 3.2.4) 中会崩溃,而 MATLAB 返回 c=[].已修复同样的错误出现在 b=get(findobj(0,'Tag','xxx'),'a') 中,它应该返回 [],即函数返回空输出的问题。已修复save.m(可能还有 load.m)在处理 MATLAB 二进制 MAT 格式时遇到问题。(当一些变量不是双精度时(例如 clear a;a.field1=single(1);save a.mat a -v6;load a.mat 在 Octave 开发版中会崩溃 ("error: load: invalid element type = 0")已修复)。 已修复dialog, errordlg, helpdlg, inputdlg, listdlg, msgbox, warndlg 在 Octave 中不存在。gco.m 现在在 Octave 中存在,但在不存在图形的情况下会创建一个图形。已修复.- fcnchk.m 在 Octave 中不存在(通常可以用 str2func.m 代替)。
isequal.m 不适用于对象(error: find: wrong type argument `class', __isequal__.m at line 147)。已修复logm(eye(3)) 会崩溃,MATLAB 返回 zeros(3)。已修复logm 有时会返回复数。已修复mat2str 在逻辑输入上会失败。已修复- 层次化 类 中存在一些问题。 已修复, 已修复, 已修复, 已修复, 已修复, 已修复, 正在进行中
未预分配的 sparse 矩阵的赋值错误(clear a; a(1,:)=sparse(1,3,1,1,3); 返回 A(I,J,...) = X: dimensions mismatch)。已修复tic/toc 不像 MATLAB 一样处理输入/输出参数(tStart=tic; any_statements; tElapsed=toc(tStart);)。已修复str2num(',1,1') 在 MATLAB 中返回 [1 1],在 Octave 中返回 []。已修复如果类定义不在路径中,从 MAT 文件 加载时,对象不会被转换为结构体。已修复从空句柄访问图形 对象属性 会显示模糊的警告(get([],'x'))。已修复兼容性:使用空变量名的 save。已修复测试 fileparts 的输入参数。已修复nargchk(1,1,1,'struct') 在 Octave 中返回一个 1x1 结构体,没有字段,在 MATLAB 中返回一个 0x1 结构体,字段为 message 和 identifier。已修复- [[];{'a'}] 返回 {[];'a'} 而不是 {'a'}, 不会修复
空结构体 struct([]) 在保存到 MAT 文件时不会被保留。已修复regexprep 中使用 反斜杠 转义字符的问题。已修复[B,C]=chol(-speye(3)) 会导致段错误。已修复mwSignedIndex 未定义 => typedef int mwSignedIndex;已修复单元格数组的单元格数组 由 matlabbatch 保存,Octave 无法正确解析。已修复- mkoctfile 不识别参数 -outdir。 正在进行中
desktop 函数不存在,在调用 desktop('-inuse') 时特别有用。已修复使用 SuiteSparse 3.2 编译失败。已修复未定义的符号:mexCallMATLAB。已修复使用 clf.m 测试会导致段错误。已修复W 指定符在 fopen 中不起作用。已修复if 语句的解析器奇异性。已修复mxArray 在 MEX 文件中的问题。已修复局部函数 在 classdef 文件中的解析错误。已修复ind2rgb 对浮点输入的处理方式与 MATLAB 不同。已修复使用 %c 将字符串转换为实数标量时,转换无效。, 已修复编译错误 yylex 在此范围内未声明。, 已修复由于 openGL 导致编译失败。已修复findobj 中的 -depth 参数。, 已修复evalc 未定义。已修复- io64.h 未定义, 正在进行中.
- 在 MATLAB 的二进制数据格式中保存 函数句柄 变量, 正在进行中
支持 close all force。, 已修复使用正则表达式时,findobj 中的警告。, 已修复打印不包含轴的图形。已修复在 uimenu 的回调中出现错误后出现错误。已修复双击时,open 的 SelectionType 不可用(仅限 Qt)。已修复- hgload 无法打开 MATLAB 图形, 正在进行中
- Octave 和 MATLAB 之间图形/uicontrol 的差异, 正在进行中
- 加载包含指向子函数的 function_handle 的 MAT 文件 时,会发生段错误, 正在进行中
图形属性 ToolBar 设置为 auto 时的行为。已修复popupmenu uicontrol 的属性。已修复edit uicontrol 的回调执行。已修复- 在 fltk 工具包中,与图像对象的鼠标交互不起作用, 正在进行中
checkbox uicontrol 的 value 属性。已修复- 创建后更改 uicontrol 的 style, 正在进行中
- popupmenu uicontrol 的显示(Qt) 正在进行中
- listbox uicontrol 的鼠标单击回调, 正在进行中
text uicontrol 的 String 属性中单元格数组的解释。已修复textscan/strread 在末尾有分隔符时,输出不正确。已修复在 --no-gui 模式下运行 Octave 时,无法退出。已修复使用 drawnow 时冻结。已修复打印选项:-noui, -painters, -opengl。已修复- 重置 uicontextmenu 的子菜单, 正在进行中
- Legend 对象在绘图中打印在线条下方, 正在进行中
uimenu 的顺序。已修复CreateMode 参数用于 msgbox/errordlg/warndlg。已修复错误 no method for 'scalar struct = scalar'。已修复- 打印时无法保留 多行 文本和 TeX 标记, 正在进行中
删除上下文菜单。已修复listdlg 的 SelectionMode 值区分大小写。已修复- 在 3D 视图中显示图像, 正在进行中
剪贴板 复制问题。已修复- 错误 base_graphics_object::get_properties: invalid graphics object, 正在进行中
uicontextmenu 的 Visible 属性。已修复即使使用 --disable-gui,也尝试构建 libgui。已修复未实现 localfunctions 函数。已修复- 未实现 import 函数, 正在进行中
- 访问 对象数组, 正在进行中
- 从 MAT 文件加载 函数句柄, 正在进行中
缺少 警告状态“all” 时出现段错误。已修复缺少 corrcoef 函数。已修复用户按下取消时,uiputfile 的第三个输出未定义。已修复编译后不会自动删除 MEX 对象文件“*.o”(MATLAB 的 mex 会删除)。已修复Octave 缓冲输出,这可能会阻塞。必须使用 fflush(stdout) 或 page_screen_output。4.4 版本中默认禁用分页器在 Suse 64 位系统上,/usr/X11R6/lib/libGL.so: 无法读取符号。已修复在此范围内未声明 CHOLMOD_NOT_POSDEF。已修复sortrows/sort: 只能对字符型字符串的单元数组进行排序错误。已修复- 连接 classdef 对象时出错, 正在进行中
恢复窗口按钮不会为其内容触发 重绘事件。已修复ginput 无法正确处理 shift/ctlr/alt 组合键。已修复- GUI 命令窗口可以支持 语法高亮显示, 正在进行中
Ctrl+C 无法中断,并在退出时导致 SIGABRT。已修复mxCreateNumericArray 大小为零。已修复使用 mx-cdm-dm.cc 构建时出错。已修复当 N < 2 时,linspace() 与 Matlab 不兼容。已修复使图表的 状态栏 中显示坐标成为可选操作。已修复当 uicontrol 的回调 返回错误时崩溃。已修复使用 waitfor 时刷新。已修复图像的 ButtonDownFcn 回调。已修复在函数 m 文件上,run 的行为与 Matlab 不同。已修复在 Ubuntu 14.04 上,doc 构建失败,出现 texi2dvi/texi2pdf 错误。已修复close(...,'force') 的图形句柄输入参数。已修复GUI 回调中的“解析错误”错误消息。已修复在“deletefcn”回调中,delete(allchild(fig)) 会引发错误。已修复缺少 getframe 函数。已修复uicontrol 的字符串中的 特殊字符。已修复prefdir 不应是私有函数。已修复Qt 图表的 帮助菜单。已修复检测 Qscintilla 库。已修复- 根图形属性“MonitorPositions”未完全实现, 正在进行中
使用 uicontrols 时默认设置。已修复使用 Qt 图表 时出现段错误。已修复- uicontrols 范围 不正确, 正在进行中
未实现 mexCallMATLABWithTrap。已修复单元数组的 mxSetDimensions。已修复realpow: 生成了复数结果。已修复- 无法从 GUI 编辑器中设置 子函数中的断点(除非使用“endfunction”关键字), 正在进行中
- 缺少 MEX 函数 mxArrayToUTF8String, 正在进行中
- 背景颜色 对按钮和单选按钮不起作用, 正在进行中
在批处理模式下使用 exit() 会抛出 octave::exit_exception。已修复axes 部分超出图形时图像的显示。已修复uicontrol 下拉菜单 大小。已修复containers.Map 的实现。已修复print.m 的 unwind_protect_cleanup 部分出现错误。已修复- strmatch,对“空”输入的不兼容结果, 正在进行中
- 补丁 面积为零,使用 OpenGL 无法显示, 正在进行中
questdlg 按相反的顺序显示按钮。已修复waitfor 应该静默接受空图形句柄。已修复在 Octave 脚本中捕获错误后出现段错误。已修复对于不匹配的 regexp,使用“names”选项时非空输出。已修复无效的 FID 和 fopen(FID)。已修复- Matlab eval 函数接受列向量字符串输入, 正在进行中
__have_gnuplot__ 未返回任何内容。已修复- uimenu 的位置有时为 0, 正在进行中
- rotate3d 与 Matlab 的兼容性, 正在进行中
uicontrol 的输出。已修复缺少 isequalwithequalnans 函数。已修复fwrite 输入参数类型。已修复set() 区分大小写。已修复更新 缺少的函数 列表。已修复- sum, cumsum 等函数错误地处理了整数输入, 正在进行中
使用 print 和 append 标记时出错。已修复- regexprep 中的 ${cmd} 替换运算符, 正在进行中
uimenu 的位置。已修复从 Octave IDE 加载图形(和其他对象)。已修复orderfields 速度很慢。已修复classdef 方法的未定义输入。已修复- zeros: like 关键字, 正在进行中
- textscan 选项 MultipleDelimsAsOne 不适用于空格或制表符, 正在进行中
如果字符串以空格结尾,ismember 会失败。已修复normest1 中的无限循环。已修复pinv(0) 与 Matlab 不同。已修复center() 依赖于广播。已修复classdef 文件中的 private 函数。已修复- max_recursion_depth 错误出现在 classdef 构造函数中, 正在进行中
isequal 速度很慢。已修复- 多维数组的显示使用“ans”, 正在进行中
- strcmp 与多维字符数组, 正在进行中
- categorical 类别的实现, 正在进行中
- 支持“import”关键字, 正在进行中
模态窗口样式 属性不起作用。已修复缺少 classdef 关键字的 help 关键字。已修复makeValidName 和 makeUniqueStrings。已修复PDF 用户手册在代码示例中使用 反单引号 `。已修复- histcounts 的实现, 正在进行中
- 实现 jsondecode、jsonencode 函数, 正在进行中
- 图形属性 IntegerHandle 在 Qt 工具包中无法完全使用, 正在进行中
图形的“Number”属性。已修复movegui 的实现。已修复savefig 的实现。已修复- Octave 4.3.0+ 无法加载之前版本保存的图形,正在处理中
帮助文本中未知命令`codequoteundirected'。已修复当qcollectiongenerator 和qhelpgenerator 未找到时,会显示警告消息。已修复使用texinfo 4.13 的文档语法。已修复执行包含图形的脚本时出现段错误。已修复opengl_renderer 关于光对象的警告消息。已修复uicontrol/uibuttongroup: 聚焦功能尚未实现。已修复- octave 使用调用图形函数的deletefcn 回调函数时发生死锁,正在处理中
文档:一些默认 Qt 属性在不同系统上的值不同。已修复类私有目录中的MEX 文件。已修复使用混合数字和字符数组输入时,ismember 出现错误。已修复使用whos -file 时的错误:未找到“load”。已修复- 使用未知或不存在的文件时,open 函数的行为,正在处理中
uicontrol 按钮的颜色。已修复uipanel 在 Linux 上不显示边框。已修复为了与 Matlab 兼容,camlight (axis_handle, ...) 应该可以工作。已修复isfolder 的实现。已修复- +package 中的私有目录,正在处理中
当菜单栏为空时,图形的位置。已修复- 如果指定变量不存在于文件中,load() 应该发出错误,正在处理中
- 当带下标的表达式包含 end 关键字时,subsasgn 的调用,正在处理中
- memmapfile 的实现,正在处理中
- 文件浏览器无响应,正在处理中
uicontrol: cdata 属性的验证。已修复为了与 Matlab 兼容,savefig 应该可以接受图形句柄的向量。已修复图形的colormap 属性不能为空。已修复- 解释器在包中找不到类定义文件的方法,正在处理中
实现 uicontrol 的聚焦行为。已修复当补丁不可见时,camlight 的使用。已修复- 移除called_from_builtin,正在处理中
VertexNormals 属性未更新。已修复使用字符串数组输入时,gunzip/bunzip2 出现错误。已修复DOCSTRING 宏无法识别matlab.lang.makeValidName。已修复切换按钮 uicontrol 的值更改未在图形上反映出来。已修复- MEX 文件中的全局变量,正在处理中
警告:弹出菜单的值不在有效的显示范围内。已修复- uicontrol 的速度问题,正在处理中
gcbf 和HandleVisibility 属性。已修复为图像的cdata 添加对更多类型的支持。已修复- edge 的二进制输入图像,正在处理中
- 颜色条的属性需要监听器来调用操作,正在处理中
lightangle 的实现。已修复[MXE Octave] lib vs lib64。已修复- GUI 中的路径管理,正在处理中
isosurface 速度很慢。已修复将YDir 设置为 normal 后,图像未显示。已修复- 包命名空间和函数名称之间的冲突,正在处理中
- 在带下标的赋值操作中调用subsref,正在处理中
- 统计 CDF 函数缺少upper 参数支持,正在处理中
- 在 Octave 5.1.0 中关闭绘图的速度更慢,正在处理中
- dbup 和dbdown 未按预期工作,正在处理中
尚未决定
[edit | edit source]- mkoctfile 定义输出文件名的选项为“-o”或“--output”,而 mex 的选项为“-output”。如果使用这些选项,则不会附加文件扩展名('.mex')。
- computer.m 返回的字符串与 MATLAB 中的不同(PCWIN、GLNX86、PCWIN64、GLNXA64、MACI64),例如 x86_64-unknown-linux-gnu。
- load.m 和save.m 在 MATLAB 中会自动添加 .mat 文件扩展名(Octave 不会)。
其他
[edit | edit source]- exist('OCTAVE_VERSION','builtin') 可以用来检测是否在 Octave 或 MATLAB 中运行。