matlab 一些方法归纳

长期更新

目录

免费试用matlab两个月

在matlab官网申请免费试用一个月,就可以在matlab online 和本地上下载matlab使用。
而且我发现若试用期到了,还可以再在官网上申请试用期extension,这样又可以再试用一个月,而且本地的matlab无需再卸载安装,而是试用期到了后,本地matlab会提示输入用户名和密码进行自动网络激活,所以我输入用户名和密码后,自动本地的matlab又激活成功了,不需要什么激活码。

一些方法

同时注释掉多行内容

image

特别注意右键菜单中还有很多功能:比如取消注释、智能缩进、转换为函数、分节符、运行节、在命令行执行所选内容、关于所选内容的帮助。这些命令都很常用!!!
打开数据提示

在视图中:
image

调用以前命令

您可以按键盘上的向上箭头键重新调用以前的命令。请注意,要执行此操作,命令行窗口必须为活动窗口。

运行部分程序

法1:运行节
法2:用鼠标和shift键的方法选中部分程序,然后右键:
image

[参考 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:

https://blog.csdn.net/ouening/article/details/51164217?utm_medium=distribute.pc_relevant.none-task-blog-2

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;

还有一种方法是手动设置,不过没法永久保存设置:
image
再点坐标区:
image
就能设置字号等。

参考了:https://blog.csdn.net/qq_40230540/article/details/102551139https://www.bilibili.com/read/cv15873809/https://blog.sciencenet.cn/home.php?mod=space&uid=430991&do=blog&quickforward=1&id=884095

记录下当前图窗大小和视角的方法:

image
image
image
image

保存变量到文件

您可以使用 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;
matlab绘制二维颜色图时,若colorbar的零值不对应白色值怎么办? 答:使用clim

先读 https://ww2.mathworks.cn/help/matlab/creating_plots/change-mapping-of-data-values-into-the-colormap.htmlhttps://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 行) 

在网上查了很多方法都解决不了这个报错。后来发现,是因为我图片中空白的地方太多了,有颜色且颜色分辨明显的地方太少了,所以无法输出矢量图:
image

这种图无法输出矢量图,会报上面的错。若去掉'-vector'(即渲染器,见 https://ww2.mathworks.cn/help/matlab/ref/print.html?searchHighlight=print&s_tid=srchtitle_print_1#d124e1087143 ),则输出的是有分辨率的图(虽然后缀是.eps),不过这种图我应该可以放进补充材料中。

当我在图窗中把图片放大一些为:
image
再使用以上print('-vector','-f501',str_remain_BCDxyy,'-depsc');来输出图片,就能输出正确的矢量图(需要等两分钟,稍微有点慢),没报错。

matlab中另一种保存矢量图的便捷方法:

在图片中点击:
image

基础知识

clear 函数清楚工作区变量

当您要在 MATLAB 中切换处理新问题时,可能需要整理工作区。您可以使用 clear 函数从工作区中删除所有变量。

任务

使用 clear 将工作区清空。

查看变量内容

请注意,变量 data 在工作区中列出。您可以通过输入变量的名称来查看任何变量的内容。

>> myvar

任务

显示变量 data 的内容。

使用 clc 命令清空命令行窗口。
内置变量和函数

pi、i 和 j 是虚数、abs、eig(计算本征值)、sqrt、sin

显示数值的精度

image.png

image.png

新建脚本或实时脚本
数组
数组

image.png

产生等距向量

image.png

image.png

转置符号将行向量转为列向量

image.png

创建零矩阵

x = zeros(2,3)

image.png

查现有矩阵的大小

如何知道现有矩阵的大小?您可以使用 size 函数。

size(x)
数组索引

注意和 python 不同,matlab 中索引是从 1 开始:

image.png

一个范围的索引:

image.png

引用:

image.png

image.png

image.png

使用方括号获得多个输出

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 中国

image.png

要读懂上面图片的求二重积分的例子,需要读以下两点:

  • 特别注意其中二维网格的例子:二维和三维网格 - MATLAB meshgrid - MathWorks 中国

    image

    比如image这个矩阵的第一行第三列这个数字等于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放在后面就是因为

    image

    从此知,比如new_integrand_BCD_xxx矩阵在image时对应的值应该放在矩阵的第一行第二列,即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及其解释:

    image

    我重复验证了,第一行确实是82.8。

参考文献

posted @ 2022-07-24 10:58  初心如磐使命在肩!  阅读(1182)  评论(0编辑  收藏  举报