跳至内容

SPM/Octave

来自维基教科书,开放世界中的开放书籍
< SPM

GNU Octave

[编辑 | 编辑源代码]

GNU Octave 是一种高级语言,它与 MATLAB 大部分兼容。它是根据 GNU 通用公共许可证条款发布的免费开源软件。

MATLAB/Octave 兼容性

[编辑 | 编辑源代码]

GNU Octave 与 MATLAB 大部分兼容

其他神经影像 MATLAB 软件包的兼容性状态

SPM/Octave 兼容性的当前状态

[编辑 | 编辑源代码]

SPM 目前不支持在 Octave 下运行,但许多模块实际上是兼容的。欢迎提供有关进一步评估和验证的反馈。在大多数情况下,SPM 的独立版本 可能是足够可行的替代方案。

如果您对此感兴趣,请随时联系 [email protected]。您需要使用最新版本的 SPM12GNU 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 时遇到的问题报告给 SPMOctave 开发人员。请确保仅当遇到 SPM 中不应该修复的问题时才报告 Octave 的错误。尽可能隔离问题。
  • 提出补丁 用于修复以下列表中尚未修复的错误。
  • 经济上支持 Octave 社区。

SPM 和 Octave 之间的兼容性问题

[编辑 | 编辑源代码]

需要更改 SPM

[编辑 | 编辑源代码]
  • 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

需要更改 Octave

[编辑 | 编辑源代码]
  • 无法使用不存在的函数名称创建函数句柄(例如,x = @crash 会失败)。 已修复
  • 行继续符 "..." 不会忽略它之后出现的任何内容,除非有注释符号%(MATLAB )。 已修复
  • strrep.m 可以作用于字符串,但不能作用于元胞数组。 已修复
  • isdeployed.m 不存在(函数 X=isdeployed,X=false;)。 已修复
  • textscan.mstrread.mtextread.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 结构体,字段为 messageidentifier 已修复
  • [[];{'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_handleMAT 文件 时,会发生段错误, 正在进行中
  • 图形属性 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 关键字。 已修复
  • makeValidNamemakeUniqueStrings 已修复
  • PDF 用户手册在代码示例中使用 反单引号 `。 已修复
  • histcounts 的实现, 正在进行中
  • 实现 jsondecodejsonencode 函数, 正在进行中
  • 图形属性 IntegerHandle 在 Qt 工具包中无法完全使用, 正在进行中
  • 图形的“Number”属性。 已修复
  • movegui 的实现。 已修复
  • savefig 的实现。 已修复
  • Octave 4.3.0+ 无法加载之前版本保存的图形,正在处理中
  • 帮助文本中未知命令`codequoteundirected' 已修复
  • qcollectiongeneratorqhelpgenerator 未找到时,会显示警告消息。 已修复
  • 使用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 中关闭绘图的速度更慢正在处理中
  • dbupdbdown 未按预期工作,正在处理中

尚未决定

[edit | edit source]
  • mkoctfile 定义输出文件名的选项为“-o”或“--output”,而 mex 的选项为“-output”。如果使用这些选项,则不会附加文件扩展名('.mex')。
  • computer.m 返回的字符串与 MATLAB 中的不同(PCWIN、GLNX86、PCWIN64、GLNXA64、MACI64),例如 x86_64-unknown-linux-gnu。
  • load.msave.m 在 MATLAB 中会自动添加 .mat 文件扩展名(Octave 不会)。

其他

[edit | edit source]
  • exist('OCTAVE_VERSION','builtin') 可以用来检测是否在 Octave 或 MATLAB 中运行。
华夏公益教科书