关于本博文的说明: 本博文主要总结笔者在运用matlab进行编程过程中遇到的语法使用问题及解决方案,记录将采用问答的形式慢慢展开,本博文将根据实际情况不定期更新.
本文所述小技巧,主要来自笔者在运用matlab进行大量数据预处理时所遇问题,及对应的解决方案,可能比较冷门,不会常用。
问:如何构建一个元胞数组(假如特别大),然后对其进行连续赋值呢?
data = cell(1,6) data = 1×6 cell 数组 {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} >> data(1,1:3)={'yes'} data = 1×6 cell 数组 {'yes'} {'yes'} {'yes'} {0×0 double} {0×0 double} {0×0 double} >> data(1,4:6)={ones(3)} data = 1×6 cell 数组 {'yes'} {'yes'} {'yes'} {3×3 double} {3×3 double} {3×3 double}Tips: 赋值的关键在于添加'{}'
问:如何自定义分辨率打印出figure内的高清图像?
matlab figure内的图像可以通过“编辑→复制图窗”进行图像复制,然后粘贴到word或者ppt中,这种方式得到的图像绝大部分情况下的清晰度都非常高,值得使用。偶尔不那么高,或者无法使用此方式复制图窗时,就可以采用此处提供的自定义分辨率打印图像的方法:
print -fhandle -rresolution -dfileformat filename % print -f1 -r600 -djpeg myfigure; % 将句柄为1的图像生成myfigure.jpg 文件,分辨率 600 dpi % 如果要求存为矢量图,可以参数“ -depsc”,其图形可用Adobe Illustrator打开。 % 其他的print命令格式请参考matlab帮助。Tips: 要明确要打印的图像所在的图窗,并更改-fhandle为-f1或-f2 ...
问:如何将用户自定义的字符串转换为变量名,实现连续变量定义
使用 eval 函数实现
>> feat_name = {'delta_net_fea','theta_net_fea','alpha_net_fea',... 'beta_net_fea','gamma_net_fea','all_net_fea',}; >> data_name = feat_name{1} data_name = 'delta_net_fea' >> eval([data_name,'=rand(2,2)']); delta_net_fea = 0.0424 0.5216 0.0714 0.0967Tips: 如果使用此方式创建大量变量时,由于未预先分配内存空间,可能为导致程序执行速度变慢,因此其适用于少量变量的新建.
问:在结构体内变量个数及变量名不一致的情况下,如何实现对结构体变量的自动获取
主要涉及两个函数 fieldnames 和 getfield 或者或者eval,前者用于获取结构体内的变量名,后两者均可用于从结构体内获取变量
% data 包含多个变量(矩阵)的结构体 data_names = fieldnames(data); % 获取变量名 for num = 1:1:length(data_names) data_name = 'var'; % eval([data_name,'=data.', data_names{num},';']); var = getfield(data,data_names{num}); endTips: 使用 eval 函数时,不是变量本身的不用加单引号,是变量本身的均需要添加引号. 函数内应是完整的语句.
问:如何自动连续存储新的变量,避免相同变量名覆盖的问题
使用 eval 函数实现
% save_data_file_name 为需要保存的变量文件名,可以是用户定义的,或是来自读入的数据文件名 save_data_file_name = filename(1:end-4); eval(['save ',save_data_file_name, ' data']); % data为需要保存的变量