关于本博文的说明: 本博文主要总结笔者在运用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.0967
Tips: 如果使用此方式创建大量变量时,由于未预先分配内存空间,可能为导致程序执行速度变慢,因此其适用于少量变量的新建.
问:在结构体内变量个数及变量名不一致的情况下,如何实现对结构体变量的自动获取
主要涉及两个函数 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});
end
Tips: 使用 eval 函数时,不是变量本身的不用加单引号,是变量本身的均需要添加引号. 函数内应是完整的语句.
问:如何自动连续存储新的变量,避免相同变量名覆盖的问题
使用 eval 函数实现
% save_data_file_name 为需要保存的变量文件名,可以是用户定义的,或是来自读入的数据文件名
save_data_file_name = filename(1:end-4);
eval(['save ',save_data_file_name, ' data']); % data为需要保存的变量