1、查找所有引用的文件
当你需要给别人拷贝脚本,而脚本中引用了许多自己写的或者自己找的文件时,要确定哪些文件是必须的,是一个令人头疼的问题,那么有了这个方法,就可以轻松解决了
[fList,pList] = matlab.codetools.requiredFilesAndProducts('demo.m');
2、Matlab结构体
Matlab的结构体实际上就是一个大大的字典,试试以下代码
dic = [];
dic.('f1') = 10;
dic.('f2') = 'joker';
disp(dic);
% f1: 10
% f2: 'joker'
那么,我们对结构体的操作空间又上升了,配合fieldnames,我们可以遍历整个结构体(字典)
3、查看 Matlab 脚本名
mfilename
不加入参数,获取当前函数的文件名(不带后缀.m),参数 'fullpath' 获取完整路径(仍然不带后缀)
mfilename('fullpath')
【20180730更新】
4、varargin / nargin && varargout / nargout
先说 nargin / nargout,分别对应为函数的输入输出个数,写一个函数如下
function [a, b, c, d] = test_io( e, f, g, h)
fprintf('nargin = %d\n', nargin)
fprintf('nargout = %d\n', nargout)
a = 1;
b = 2;
c = 3;
d = 4;
不同调用会得到不同的值,例如
然而当输入输出个数超过定义个数范围时,就会报错
那么这个时候可以使用 nargin / nargout 配合判断,完成输入输出,定义函数如下
function varargout = test_io_var( varargin )
fprintf('nargin = %d\n', nargin)
fprintf('nargout = %d\n', nargout)
varargout(1:nargout) = {1};
那么可以尝试任意多个输入输出,都没问题了
varargin 和 varargout 为两个特定关键字,在其前面还可以增加一定数量的固定参数,比如
function [a, b, varargout] = test_io_var_append( c, d, varargin )
fprintf('nargin = %d\n', nargin)
fprintf('nargout = %d\n', nargout)
a = 1;
b = 1;
varargout(1:nargout) = {1};
varargin 和 varargout 均为元胞数组。对于输入参数的获取、输出参数的赋值,只要按照顺序操作即可。
5、guidata 函数完成 GUI 的参数传递
注意这个函数主要在 GUI 中使用(guide创建),这个函数有两个形式:
5.1 获取 handles
handles = guidata( hObject );
这个函数获取保存在 hObject 这个组件上的所有句柄,包含这个 figure 的所有句柄,这些句柄组成一个结构体,结构体的各个 filedname 即为 guide 属性编辑器中所配置的 tag 值,对应 field 为该 tag 标记的组件句柄。
5.2 更新 handles
guidata(hObject, handles)
这个操作最开始是困扰我的,因为 MATLAB 函数与C++和JAVA不同,输入输出接口是可变的。guidata通过 nargin / nargout 这种方式来调整函数的行为,当接口为 “没有输出+两个输入” 时,就会完成句柄的更新;而接口是“一个输出+一个输入”时,则完成句柄的获取。
6、解包 /打包( 函数传参)
解包这个概念是学习python的时候看到的,用在这里,也是因为行为特性一致。
如下写法,可以将 top 函数中的所有输入参数,按照顺序赋值给 level1 函数。(类似于解包)
function top(varargin)
level1(varargin{:})
function level1(varargin)
而如下写法,则可以将 level1 函数中的所有输出,按照顺序赋值给 top 函数。(类似于打包)
function varargout = top()
[varargout{:}] = level1()
function varargout = level1()