如何在Jupyter Notebook的MATLAB内核中直接编写函数?
我之前也踩过这个坑,太懂这种不想来回切换外部.m文件的烦躁了!在Jupyter的MATLAB内核里,每个代码单元格默认是当作脚本来执行的,而MATLAB的脚本里直接写函数定义会触发Error: Function definitions are not permitted in this context的报错——这就是问题的根源。不过有几个不用依赖外部文件的实用办法,亲测有效:
把函数定义放在单元格末尾(局部函数方式)
MATLAB允许在脚本的最后添加局部函数,只要所有可执行的代码都放在函数定义之前就行。举个例子:% 先写调用逻辑 result = myAdd(2, 3); disp(result); % 函数定义必须放在单元格的最后位置 function out = myAdd(a, b) out = a + b; end执行这个单元格后,函数会被加载到工作区,后续单元格也能直接调用它。
用匿名函数处理简单逻辑
如果你的函数逻辑很简短(一行就能写完),匿名函数是最省心的选择,直接在单元格里定义+调用:myMultiply = @(x, y) x * y; disp(myMultiply(4, 5));这种方式不需要写完整的
function...end结构,适合简单运算或者轻量逻辑的函数。用
matlab.lang.makeFunctionHandle创建复杂函数句柄
要是函数逻辑有多行,可以把函数代码拼接成字符串,再用这个工具转换成函数句柄,完全不用外部文件:funcStr = ['function out = myComplexFunc(a, b)', ... ' if a > b', ... ' out = a^2 - b;', ... ' else', ... ' out = b^2 + a;', ... ' end', ... 'end']; myComplexFunc = matlab.lang.makeFunctionHandle(funcStr); disp(myComplexFunc(3, 5));注意拼接字符串时要保持MATLAB的语法格式,比如换行的地方用
...连接。单独用单元格定义函数(高版本MATLAB支持)
如果你用的是MATLAB R2021a及以上版本的内核,可以直接创建一个只包含函数定义的单元格:function out = mySubtract(a, b) out = a - b; end执行这个单元格后,函数就会被加载到工作区,之后的任意单元格都能直接调用它,就像调用外部函数一样方便。
我个人日常用得最多的是前两种方法:简单逻辑用匿名函数,复杂一点的就把函数塞到单元格末尾当局部函数,完全不用碰外部.m文件。你可以根据自己的函数复杂度选合适的方式试试!
内容的提问来源于stack exchange,提问作者splinter

