matlab 一些方法归纳
长期更新
- 免费试用matlab两个月
- 一些方法
- 画图相关:
- matlab画图时怎么显示latex:
- matlab画图时在坐标轴显示latex的一个重要注意事项:不要使用\text:
- latex怎么打出埃的符号:
- 在多个窗口画多个图
- PRB等论文的图片其实都要求坐标刻度、label的字号都比较大,所以画图时必须设置:
- 记录下当前图窗大小和视角的方法:
- 保存变量到文件
- 可以使用
load
命令从 MAT 文件加载变量。 - 在集群中使用load命令时的一个注意事项: 加载的文件名不能太长
- 推荐本地matlab绘图而不是matlab online绘图
- 有时用python画.mat文件的图更好
- 按变量名保存图片到指定路径
- matlab创建新文件夹到指定路径,并按变量给新文件夹命名、获取创建的新文件夹的路径、保存数据到指定路径,并按变量给数据文件命名
- matlab画图循环保存,matlab批量处理excel数据,绘图并保存:整个流程都可以用matlab自动实现,就像linux的shell语言一样
- matlab绘制二维颜色图表示z轴,并添加等高线
- matlab修改colorbar和colormap
- matlab绘制二维颜色图时,若colorbar的零值不对应白色值怎么办? 答:使用clim
- 使用print保存矢量图时有一个报错
绘制场景时出错
,思考了很久才解决: - matlab中另一种保存矢量图的便捷方法:
- 基础知识
- 数值计算的一些方法
- 参考文献
免费试用matlab两个月
在matlab官网申请免费试用一个月,就可以在matlab online 和本地上下载matlab使用。
而且我发现若试用期到了,还可以再在官网上申请试用期extension,这样又可以再试用一个月,而且本地的matlab无需再卸载安装,而是试用期到了后,本地matlab会提示输入用户名和密码进行自动网络激活,所以我输入用户名和密码后,自动本地的matlab又激活成功了,不需要什么激活码。
一些方法
同时注释掉多行内容
特别注意右键菜单中还有很多功能:比如取消注释、智能缩进、转换为函数、分节符、运行节、在命令行执行所选内容、关于所选内容的帮助。这些命令都很常用!!!
打开数据提示
在视图中:
调用以前命令
您可以按键盘上的向上箭头键重新调用以前的命令。请注意,要执行此操作,命令行窗口必须为活动窗口。
运行部分程序
法1:运行节
法2:用鼠标和shift键的方法选中部分程序,然后右键:
[参考 https://blog.csdn.net/ashtondeng/article/details/120205621]
disp函数的用法:
同时输出字符串和数字:
Matlab命令窗口输入如下代码
test=3;
disp([‘my test=’,num2str(test)])
num2str能将数值转换为字符串。Matlab命令窗口输出如下
my test=3
计算程序运行时间
在脚本开始和末尾加上:
tic %计时开始
toc %计时结束
(来自https://zhuanlan.zhihu.com/p/22762787)
提高matlab程序运行速度的方法
https://www.bilibili.com/video/BV1p5411Y7a1?spm_id_from=333.337.search-card.all.click :
最快的加速方法是提前定义变量,我之前第五版程序没提前定义变量,就是直接赋值,比如三维和四维矩阵。这样导致matlab不得不动态改变存储空间,这样会导致运行时间增加几十倍。
所以在第六版中,我将matlab中一些三维矩阵和4维矩阵改为了提前定义三维和四维矩阵:来自:matlab怎么创建三维矩阵。
matlab并行计算其实我觉得很麻烦,需要更改很多,还得注意变量的分类,看起来很麻烦。
一行代码太长怎么换行
在MATLAB中,符号“...”表示下一行的内容是上一行的延续。
来自https://blog.csdn.net/wenhao_ir/article/details/51784475
画图相关:
matlab画图时怎么显示latex:
matlab画图时在坐标轴显示latex的一个重要注意事项:不要使用\text:
我尝试写$\mu[\text{eV}]$
,结果发现会报错,显示不了latex,这是因为matlab中的latex无法使用\text,替代方法是:$\mu$[eV]
,这样才能正确显示latex:
latex怎么打出埃的符号:
\AA
在多个窗口画多个图
https://xinzhi.wenda.so.com/a/1637029282200070
PRB等论文的图片其实都要求坐标刻度、label的字号都比较大,所以画图时必须设置:
例如:
%从刘卫国书105页知,下面这个命令能画出6个能带
figure(1);
plot(-ky_max:interval:ky_max,test_band) %test_band是一个size(y,2)*6的哈密顿量,只有6列。 %size(y,2)表示y矢量的列数
set(gca,'fontsize',25,'LineWidth',6.2); %PRB有要求:设置坐标刻度的字号!(其实这行连colorbar、label的字体字号也改),所以必须有这行。gca的含义是:get current axe. gcf是:get current figure
%'LineWidth',6.2是将边框的线宽设为6.2,因为有时候在matlab中能显示的边框,放入latex后莫名其妙地边框消失或变小,这样方法通过人为调整边框线宽就不会消失边框。注意必须是6.2这么大的值
%下面这部分PRB不一定有要求,也可以注释掉,因为set(gca,'fontsize',20);其实已经实现了下面这部分的一些功能。
axis([-ky_max,ky_max,-1,1]); %设置坐标轴上下限 axis([xmin, xmax, ymin, ymax]);
%设置x、y轴范围和刻度:
set(gca, 'XTick',[-0.5:0.5:0.5]) ; %设置要显示坐标刻度
set(gca, 'XTickLabel',[-0.5:0.5:0.5]); %给坐标加标签
set(gca, 'YTick' , [-0.8:0.4:0.8] ) ; %设置要显示坐标刻度
set(gca, 'YTickLabel',{'$10^{3}$','$10^{4}$','$10^{5}$','$10^{6}$','$10^{7}$','$10^{8}$','$10^{9}$','$10^{10}$','$10^{11}$','$10^{12}$'},'TickLabelInterpreter','latex'); %给坐标加标签,参考了https://ww2.mathworks.cn/help/releases/R2022a/matlab/creating_plots/change-tick-marks-and-tick-labels-of-graph-1.html
set(gcf,'position',[60,60,835,800]); %PRB有要求:设置画图的大小: 四个数分别代表距 y 轴的距离、距 x 轴的距离、图宽、图长.当画图大小为835x800时,就是一个横纵轴就构成正方形
%必须最后设置xlabel和ylabel,这样才能真正更改到label的字号大小:PRB有要求:
xlabel('$k_y[\AA^{-1}]$','interpreter','latex','FontSize',28),ylabel('$energy,\varepsilon[eV]$','interpreter','latex','FontSize',28); %,'FontSize',32表示字体大小为32磅.
%grid on;
grid off;
还有一种方法是手动设置,不过没法永久保存设置:
再点坐标区:
就能设置字号等。
参考了:https://blog.csdn.net/qq_40230540/article/details/102551139 、https://www.bilibili.com/read/cv15873809/ 、https://blog.sciencenet.cn/home.php?mod=space&uid=430991&do=blog&quickforward=1&id=884095
记录下当前图窗大小和视角的方法:
保存变量到文件
您可以使用 save
命令将工作区中的变量保存到称为 MAT 文件的 MATLAB 特定格式文件中。
要将工作区保存到名为 foo.mat
的 MAT 文件中,请使用命令:
>> save foo
任务
将工作区变量保存到名为 datafile.mat
的文件中。
可以使用 load
命令从 MAT 文件加载变量。
在工作区中,您可以看到 clear
命令清空了所有变量。
>> load foo
在集群中使用load命令时的一个注意事项: 加载的文件名不能太长
load('/home/xxxxxxx20/nonliear/interval_0.002_d1x_1e-2_d1z_25e-3_nonliear_spin_hall_numerical_Berry_version5.mat');
会出现报错,程序无法运行,这个问题困扰了很久,最后在wang ya ru 师姐的提醒下,发现是因为我.mat文件名太长了。(也可能是因为我把路径也包括在load中,这样导致太长了?)。其实这行代码在本地电脑的matlab中能运行成功,在本地电脑中,文件名这么长没关系。
在集群中运行时,我将上面这行代码改为了load('/home/xxxxxxx20/nonliear/interval_0.002_d1x_1e-2_d1z_25e-3.mat');
,缩短文件名,就运行成功了!
在save时,这么长的文件名,如果不加指定保存路径,则是可以的。若加上指定的保存路径,还能运行成功吗?
推荐本地matlab绘图而不是matlab online绘图
应该用本地的matlab绘图,而不是matlab online绘图,因为本地的matlab绘图图片更清晰,更容易旋转等操作,而且因为matlab online上传数据不能超过300M,所以对于比较大的数据文件,只能使用matlab本地绘图。
有时用python画.mat文件的图更好
比如在一个图中输出多个小图,用matlab画就有点丑。用python画图更好。
利用python怎么读取.mat文件内容:https://www.php.cn/python-tutorials-493543.html
按变量名保存图片到指定路径
网上说的很多方法都运行不成功,可能是因为matlab的版本的原因。所以最好还是看matlab官网的帮助文档。
我根据帮助文档中print:https://ww2.mathworks.cn/help/releases/R2022a/matlab/ref/print.html?#bukyb6e-1-resolution (重要,只要仔细读了这个就能懂以下代码) 和https://www.ilovematlab.cn/forum.php?mod=viewthread&page=1&tid=603409 ,知:我习惯用print保存图片:
%%
%保存图片到指定文件夹,并按变量命名
str = ['C:\Users\Documents\MATLAB\New Folder\','BCD;','photon_energy=',num2str(hbar_w),'eV;',';threshold=',num2str(threshold),';k_interval=',num2str(interval),';tau_charge=',num2str(tau_charge),'s;tau_spin=',num2str(tau_spin),'s;d1x=',num2str(d1x),';d1z=',num2str(d1z),'.eps'];
%注意文件名有长度限制,由电脑系统限制,所以不用中文.
%注意'C:\Users\Documents\MATLAB\New Folder\'是指定路径,后面的才是文件名
%str的意思是字符串
%在画图时若加上这个图例可以把str放在图片上:legend(str,'location','northeast');
print('-f3',str,'-depsc');
% 注意矢量图没有分辨率概念,不需要'-r600'分辨率。
% '-f3'是因为帮助文档的print中说:使用其 Number 属性的值引用图窗,该值是显示在图窗窗口标题栏中的整数值。例如,保存图窗并在标题栏中显示 Figure 2。在整数值前面加上 -f。
% '-depsc'是说明输出.eps的图片。
matlab创建新文件夹到指定路径,并按变量给新文件夹命名、获取创建的新文件夹的路径、保存数据到指定路径,并按变量给数据文件命名
以下程序的灵感来自https://blog.csdn.net/lucyyy239/article/details/115642375 和https://blog.csdn.net/qq_36108664/article/details/109601927。
%--------------------------------------------------------------
%创建新文件夹到指定路径,并按变量给新文件夹命名:
str_filefolder = ['charge_PGE_v8;','frequ=',num2str(frequency),';thres=',num2str(threshold),';inter=',num2str(interval),';tau_cha=',num2str(tau_charge),';d1x=',num2str(d1x),';d1z=',num2str(d1z)];
%这是文件夹的名字,是一个字符串。
%我之前将文件夹名字取为:(但此文件夹名字太长了,会报错,最后save输出的文件损坏,我估计是路径太长,然后文件名又太长,所以最后save在操作时就损坏了(确实是此原因,因为我将文件名缩短时就没此问题).我就没有用了)
% str_filefolder = ['nonliear_charge_PGE_version8;','photon_energy=',num2str(hbar_w),'eV;',';threshold=',num2str(threshold),';k_interval=',num2str(interval),';tau_charge=',num2str(tau_charge),'s;tau_spin=',num2str(tau_spin),'s;d1x=',num2str(d1x),';d1z=',num2str(d1z)]; %这是文件夹的名字,是一个字符串
mkdir('C:\Users\Documents\MATLAB\',str_filefolder); %在'C:\Users\Documents\MATLAB\'路径下创建文件名为str_filefolder的文件夹
%--------------------------------------------------------------
%获取创建的新文件夹的路径:
str_filefolder_path = strcat('C:\Users\Documents\MATLAB\',str_filefolder,'\');
%创建的新文件夹的路径,这是一个字符串,类似'C:\Users\Documents\MATLAB\New Folder1\'
%strcat的作用是水平串联字符串,见https://ww2.mathworks.cn/help/releases/R2022a/matlab/ref/strcat.html?s_tid=doc_ta
%--------------------------------------------------------------
%为了在集群中运行再在win中画图,保存数据到指定路径,并按变量给数据文件命名:
str = [str_filefolder_path,'nonliear_charge_PGE_v8;','photon_energy=',num2str(hbar_w),'eV;',';threshold=',num2str(threshold),';k_interval=',num2str(interval),...
';tau_charge=',num2str(tau_charge),'s;tau_spin=',num2str(tau_spin),'s;d1x=',num2str(d1x),';d1z=',num2str(d1z),'.mat'];
%注意文件名有长度限制,由电脑系统限制,所以不用中文.
%注意'C:\Users\Documents\MATLAB\New Folder1\'或str_filefolder_path是指定路径,后面的才是文件名
%str的意思是字符串
save(str,'-v7.3','-nocompression')
%这是为了在集群中运行得到数据再在win端画图,见https://ww2.mathworks.cn/help/matlab/ref/save.html?overload=save+false
%save(filename,variables,fmt) 以 fmt 指定的文件格式保存。variables 参数为可选参数。如果您不指定 variables,save 函数将保存工作区中的所有变量。
matlab画图循环保存,matlab批量处理excel数据,绘图并保存:整个流程都可以用matlab自动实现,就像linux的shell语言一样
https://blog.csdn.net/weixin_39913141/article/details/115816430
matlab绘制二维颜色图表示z轴,并添加等高线
写得最好的见:https://zhuanlan.zhihu.com/p/49615571
matlab修改colorbar和colormap
从https://blog.csdn.net/weixin_42943114/article/details/81811556 知,因为matlab自带的colormap中没有0值对应白色这种科研中重要的colormap,所以很不方便。
对于此问题,写得最好:https://zhuanlan.zhihu.com/p/349138194 ,给出了三种最简洁的处理方法:
- 使用自带的colormap
- 用python中的colormap转为matlab中的colormap。链接中还给出了最简单的这样处理的方法。
- 自定义colormap,文中给出了代码:(我就用这种方法,感觉是最简单的一种自定义方法之一,感谢作者)
%colormap的自定义设置:
color_1=[0,0,1]; %蓝色的RGB三元组,来源见https://ww2.mathworks.cn/help/matlab/ref/colormap.html
color_2=[1,1,1]; %白色的RGB三元组
color_3=[1,0,0]; %红色的RGB三元组
num12=100;num23=100; %若都取为10,则就是阶梯渐变的colorbar,这种有时候也有用,有时看得更清楚,见https://blog.csdn.net/weixin_42943114/article/details/81811556
R_mat=[linspace(color_1(1),color_2(1),num12),linspace(color_2(1),color_3(1),num23)];
G_mat=[linspace(color_1(2),color_2(2),num12),linspace(color_2(2),color_3(2),num23)];
B_mat=[linspace(color_1(3),color_2(3),num12),linspace(color_2(3),color_3(3),num23)];
color_map_RGB=[R_mat',G_mat',B_mat'];
figure(2)
pcolor(x_grid,y_grid,z);colormap(color_map_RGB);shading interp;colorbar;
-
另外,https://blog.csdn.net/weixin_42943114/article/details/81811556 中提到一个问题:"需要注意,不是颜色越多越好。有时候,为了突出要表示的变量,反而会采用减少颜色的方式去表示。"
-
关于matlab自带的colormap和RGB的知识,见:https://ww2.mathworks.cn/help/matlab/ref/colormap.html
-
另一种中间为0值为白色的方法:https://zhuanlan.zhihu.com/p/340975448
然而,以上这几种让0值为白色的方法都无法保证所有数值的情况都是中间为白色:
,此时怎么办?答案:
matlab绘制二维颜色图时,若colorbar的零值不对应白色值怎么办? 答:使用clim
先读 https://ww2.mathworks.cn/help/matlab/creating_plots/change-mapping-of-data-values-into-the-colormap.html 和 https://ww2.mathworks.cn/help/matlab/ref/clim.html 就能懂怎么设置颜色值范围,注意认真读里面的例子。然后就能懂以下程序。将以下程序加入画二维颜色图的程序中,就能实现零值对应白色的功能。
%使得colorbar的0值一定对应白色:
%此参考了https://ww2.mathworks.cn/help/matlab/creating_plots/change-mapping-of-data-values-into-the-colormap.html
% 和https://ww2.mathworks.cn/help/matlab/ref/clim.html,读了这两个链接就能懂以下程序。
lims = clim; %查看当前图的颜色范围,比如若结果为:lims =1.0e+07*-1.9139 1.0e+07*6.1761,此时图中的colorbar,0值并不对应白色,所以使用以下更改:
if lims(1)<0 && lims(2)>0
clim([min(lims(1),-lims(2)) max(-lims(1),lims(2))]); %这就是更改.更改为了对称的形式,实际上等价于:clim([1.0e+07*(-6.1761) 1.0e+07*6.1761]),所以0值对应白色,而且从https://ww2.mathworks.cn/help/matlab/creating_plots/change-mapping-of-data-values-into-the-colormap.html知,小于1.0e+07*-1.9139的颜色在结果图中不会呈现.
end
若是用python画图,如何在不均匀的色阶下将0设置为白色?此问题的解决方案:https://www.coder.work/article/4976949
使用print保存矢量图时有一个报错绘制场景时出错
,思考了很久才解决:
报错:
>> print('-vector','-f501',str_remain_BCDxyy,'-depsc');
警告: 绘制场景时出错: Unidentified trouble during rendering
> 位置:defaulterrorcallback (第 12 行)
位置: matlab.graphics.internal/mlprintjob/setPaintDisabled
位置: alternatePrintPath
位置: alternatePrintPath
位置: onCleanup/delete (第 23 行)
位置: alternatePrintPath
位置: print (第 83 行)
在网上查了很多方法都解决不了这个报错。后来发现,是因为我图片中空白的地方太多了,有颜色且颜色分辨明显的地方太少了,所以无法输出矢量图:
这种图无法输出矢量图,会报上面的错。若去掉'-vector'(即渲染器,见 https://ww2.mathworks.cn/help/matlab/ref/print.html?searchHighlight=print&s_tid=srchtitle_print_1#d124e1087143 ),则输出的是有分辨率的图(虽然后缀是.eps),不过这种图我应该可以放进补充材料中。
当我在图窗中把图片放大一些为:
再使用以上print('-vector','-f501',str_remain_BCDxyy,'-depsc');
来输出图片,就能输出正确的矢量图(需要等两分钟,稍微有点慢),没报错。
matlab中另一种保存矢量图的便捷方法:
在图片中点击:
基础知识
clear 函数清楚工作区变量
当您要在 MATLAB 中切换处理新问题时,可能需要整理工作区。您可以使用 clear
函数从工作区中删除所有变量。
任务
使用 clear
将工作区清空。
查看变量内容
请注意,变量 data
在工作区中列出。您可以通过输入变量的名称来查看任何变量的内容。
>> myvar
任务
显示变量 data
的内容。
使用 clc
命令清空命令行窗口。
内置变量和函数
pi、i 和 j 是虚数、abs、eig(计算本征值)、sqrt、sin
显示数值的精度
新建脚本或实时脚本
数组
数组
产生等距向量
转置符号将行向量转为列向量
创建零矩阵
x = zeros(2,3)
查现有矩阵的大小
如何知道现有矩阵的大小?您可以使用 size
函数。
size(x)
数组索引
注意和 python 不同,matlab 中索引是从 1 开始:
一个范围的索引:
引用:
使用方括号获得多个输出
size
函数可以应用于矩阵,以生成单个输出变量或两个输出变量。使用方括号 (<span class="tag">[<span class="pln"><span> <span class="tag">]
) 获得多个输出。
[xrow,xcol] = size(x) %因为当x是一个矩阵时,size(x)是两个数字
标量与数组相加
MATLAB 的设计让您能够自然地处理数组。例如,您可以将一个标量值与数组中的所有元素相加。
y = x + 2
将数组中的所有元素与某个标量相乘或相除
您可以将数组中的所有元素与某个标量相乘或相除。
z = 2*x
y = x/3
y
的值是使用 m
计算的。修改 m
时,是否重新计算 y?答案:不会!
当您在命令提示符下仅输入变量名称时,MATLAB 将会返回该变量的****当前值。
y
的值是使用 m
计算的。修改 m
时,是否重新计算 y?答案:不会!
在命令提示符下只输入变量名称 y
(并按 Enter )。
数值计算的一些方法
使用 trapz
求二重积分:
梯形数值积分 - MATLAB trapz - MathWorks 中国:
要读懂上面图片的求二重积分的例子,需要读以下两点:
-
特别注意其中二维网格的例子:二维和三维网格 - MATLAB meshgrid - MathWorks 中国:
比如
这个矩阵的第一行第三列这个数字等于X这个向量的第三个数字的平方加上Y这个向量的第一个数字的平方。
在程序第二版中"%求整流BCD电荷流对应的电导率sigma_BCD_0w”这部分中:
new_integrand_BCD_xxx(index_of_ky,index_of_kx)=integrand_BCD_xxx(h);
这里将index_of_ky放在前面,而index_of_kx放在后面就是因为:
从此知,比如new_integrand_BCD_xxx矩阵在
时对应的值应该放在矩阵的第一行第二列,即ky_vector这个矢量的第一个数字、kx_vector这个矢量的第二个数字。所以在
new_integrand_BCD_xxx(index_of_ky,index_of_kx)=integrand_BCD_xxx(h);
中将index_of_ky放在前面,而index_of_kx放在后面。 -
梯形数值积分 - MATLAB trapz - MathWorks 中国:注意此例子中指定dim=2及其解释:
我重复验证了,第一行确实是82.8。