matlab 图片最多显示几张_【科研利器】带你get“研”途上的MATLAB提高篇

本文介绍了MATLAB中导出高清图片的三种方法,包括使用Copy到剪贴板、imwrite函数和saveas命令。此外,详细讲解了如何让MATLAB自动逐个运行多个程序,如使用子程序、嵌套函数和parfor函数。还分享了一些MATLAB的矩阵运算进阶知识和实用小命令,帮助提升MATLAB使用效率。
摘要由CSDN通过智能技术生成
56744d2c410588c674fc0a5110d06912.png de413e45dd0ce26420d93aee4a7e74fb.png

在上一期中,经过MATLAB的基础介绍以及简答应用,相信大家已经可以基础运用这个软件了。在本期中我们为大家拓展延伸一些MATLAB的其它方面。

7defda75dec5dbcd0e99d7ea05459cc8.png

1. Matlab导出高清图片的正确方法

1.1copy到剪贴板

在Figure中使用菜单Edit中的Copy figure,这样图像就复制到剪贴板,然后再贴到想要贴的位置即可。

8d8ecf0fdc7637077b7dcfeddefb9304.png

1.2使用imwrite 函数

当使用imshow将图像显示在坐标系以后,可以使用getimage函数获取坐标系中的图像文件,然后使用imwrite保存图像。代码如下:

I=getimage(gcf);

imwrite(I, " myphoto.jpg')

1.3 Saveas的方法

有两种:1.3.1 菜单中直接另存为,在Figure中使用菜单File中的saveas,

然后选择保存形式(fig, eps, jpeg, gif, png, bmp等):

70383bcef981b0b99385820b837711ef.png 94806d576b2e7e9cf323ca9b0880b410.png

1.3.2saveas命令格式:

Matlab提供saveas函数可以直接将指定Figure中的图像进行保存,saveas有个功能是保存为fig文件,下次可以直接编辑这个fig文件画图:

saveas(figure_handle, filename, fileformat)其中,

figure_handle是图形句柄,如果图形窗口标题栏是’figure 2’,则句柄就是2。用gcf可以获取当前窗口句柄。

filename是文件名。

fileformat是指定存储格式。常用的有:

BMP:‘-dbitmap’图片清晰,但文件极大;

TIFF:‘-dtiff'图片较清晰,文件大小还行;

PNG:‘-dpng’和TIFF差不多;

JPEG:‘-djpeg’文件小,较清晰GIF:‘-dgif ’文件小但不清晰。

最后,我们总结一下Matlab导出图片的几种方法:

(1) Copy到剪贴板,常用于把最新结果发给别人进行初步讨论。

(2) imwrite常与getframe 结合使用,主要目的不是为了保存高清图片,而是为了批量保存截图,为下一步生成动画或gif动图做准备。

(3) saveas最常用的功能并不是直接导图,而是保存为fig格式。将来需要细致修改时,可以方便打开并二次导出。

2.如何使用Matlab让多个程序一个接一个地跑?

相信有些同学会有这种困扰,在做模拟时,经常需要研究不同参数对结果的影响。具体到实际操作,就是写一个M文件,然后反复跑各种参数下的结果。而最原始的方法是:先跑一个程序,运行之后查看结果;然后再修改里面的参数,重新运行。这样的缺点是需要人在旁边看着,手动修改参数,提交任务,查看结果。

那么有没有一种办法:写多个m文件,然后让Matlab自己逐个地运行这些程序? 

2.1 多个Matlab窗口:

这种方法最容易想到,但是不可取,因为需要试验的参数可能很多,打开多个窗口后,电脑变卡,可能会导致重启。

2.2 多个子程序:

假如现在有一堆子程序,simulation1.m,simulation2.m,simulation3.m……每个程序里面有不同的参数。如果这些程序在一个目录下,只需在主程序中输入simulation1; simulation2; simulation3;……就可以了。但问题是可能每个程序都会输出一堆结果和文件,所以不想让它们在同一个文件夹下面。不然这些结果会堆叠在一起,后面的处理比较麻烦。如果不在同一目录,那就用cd+程序所在路径切换到相应工作目录即可。

cd 'simulation1.m文件所在的目录'

simulation1;

cd 'simulation2.m文件所在的目录'

simulation2;

cd 'simulation3.m文件所在的目录’

simulation3;

2.3 嵌套函数:

上面的方法是可以解决问题,但是需要生产一大堆m文件。比如如果待测试的参数有1万个,就得生产1万个m文件。而且这一大堆m文件,仅仅只是某些参数的值不同。使用嵌套函数,只需要写两个函数即可。

写一个m函数用于模拟

function [out1,out2...] = test (input1,input2...)

写一个主函数﹐循环调用则试函数

for....

test(改变参数)

保存结果

end

第一个是模拟函数,从主函数那里得到输入参数的值,然后对每个参数进行模拟;第二个是主函数,用来循环赋值,并反复调用模拟函数。这样就可以安心的让Matlab自己跑程序了。

2.4 parfor函数:

Matlab还有批处理功能(Batch Processing),在并行工具箱里面。还有传说中的parfor函数。parfor就是paralle+for,也就是并行的for循环,它的大致意思是会自动构造几个matlab的执行进程,并行地处理你的数据。简单的例子如下:假如函数f是一个非常耗时的模拟函数,然后如果想把矩阵A中的每一个元素传递到函数f中进行运算,运算结果保存在矩阵B里面,那么可以这样操作:

parfor i = 1:length(A)

B(i)= f(A(i));

end

这样矩阵A各个元素的计算就可以并行操作而且可以节省很多时间。

3. 矩阵运算进阶

3.1.向量点积:

函数 dot

格式 C = dot(A,B) %若A、B为向量,则返回向量A与B的点积,A与B长度相同;若为矩阵,则A与B有相同的维数。

C = dot(A,B,dim) %在dim维数中给出A与B的点积

例 >>X=[-1 0 2];

>>Y=[-2 -1 1];

>>Z=dot(X, Y)

则显示:Z =4

还可用另一种算法:

sum(X.*Y)

ans=4

3.2向量叉乘:

在数学上,两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中,用函数cross实现。

函数 cross

格式 C = cross(A,B) %若A、B为向量,则返回A与B的叉乘,即C=A×B,A、B必须是3个元素的向量;若A、B为矩阵,则返回一个3×n矩阵,其中的列是A与B对应列的叉积,A、B都是3×n矩阵。

C =cross(A,B,dim)%在dim维数中给出向量A与B的叉积。A和B必须具有相同的维数,size(A,dim)和size(B,dim)必须是3。

例计算垂直于向量(1, 2, 3)和(4, 5, 6)的向量。

>>a=[1 2 3];

>>b=[4 5 6];

>>c=cross(a,b)

结果显示:

c=-3 6 -3

可得垂直于向量(1, 2, 3)和(4, 5, 6)的向量为±(-3, 6, -3)

3.3混合积:

混合积由以上两函数实现:

例计算向量a=(1, 2, 3)、b=(4, 5, 6)和c=(-3, 6, -3) 的混合积

解:

>>a=[1 2 3]; b=[4 5 6];c=[-3 6 -3];

>>x=dot(a, cross(b, c))

结果显示:x =54

注意:先叉乘后点乘,顺序不可颠倒。

函数 deconv

格式 [q,r] = deconv(v,u) %多项式v除以多项式u,返回商多项式q和余多项式r。

注意:v、u、q、r都是按降幂排列的多项式系数向量。

4.MATLAB 一些相见恨晚的小命令

4.1  bsxfun

强大的、万能的、不同维数的矩阵扩展混合运算,从此告别矩阵运算中的for循环,另matlab里所有以fun为后缀的命令都很好用,arrayfun,cellfun,structfun,等等

4.2  @() 匿名函数

使用函数式编程,在编写以数学公式为主的程序中比传统编程方法好得多

4.3  set(gca,...)等

所有与画图相关的命令都包含了千奇百怪的属性和参数,非常实用,如著名的set(gca,...)

4.4     $ $

画图中的标题、注释等文字内容是可以直接使用latex格式的,只须在包含latex命令的部分前后用$框起来即可

4.5 slice  

高维切片,要在三维空间中表现三个以上变量的函数关系,必备此命令

4.6 转置但不共轭 b = a.'

4.7 得到列向量 b = a(:),相应的,得到行向量就是 b = a(:).'

4.8 清除并更新所有class 的定义clearclasses

当你修改了某些 class 的定义时,需要调用此命令——仅仅clear all 是不够的。

4.9 忽略某些返回参数

[~, idx] = max(a)

忽略最大值,只返回最大值的索引。

【注】这种语法是在Matlab 7.9 (2009b) 中引入的,在此之前的版本不支持这种用法。如果你使用早期版本,可以使用如下写法:

[tmp,idx]=max(a);cleartmp

或者一句话搞定

[idx, idx] = max(a)

不过第二种写法不见得每个人都会喜欢。

4.10 去除长度为1 的维度(常用于3D 矩阵转为2D)

b=squeeze(a)

Simulink 的 save to workspace 模块经常得到一个 [m x 1x n] 的三维矩阵,直接使用非常不便。使用squeeze 后,会将其转换为 [m xn] 的二维矩阵。

4.11 代码运行耗时显示

tic;some_code_to_run();toc

tic/toc 会在 Matlab 命令行中打印出两条命令之间的代码的运行耗时。更详细的代码效率分析,可以使用profile 命令。

4.12 电脑跑分

bench

只能用于相同版本的 Matlab 下电脑之间的比较。

4.13 记录命令行命令

diaryon% Lots of my Matlab commands here.

diaryoff

使用 diary 好处是运行结果也会被记录下来,并且以纯文本方式存储,方便编辑。更正式的报告,则推荐使用publish。

4.14 反转向量

b=fliplr(a)  %For row-vector a.

b=flipud(a)  %For column-vector a.

b=wrev(a)  %For any vector a.

b=a(end:-1:1); %This is the implementation of function wrev.

4.15去除数据中的NaN

a(isnan(a)) = []

对于 inf 和 -inf,使用 isinf 命令。

4be25847164857879b9209ce399306ee.png

通过以上内容,相信大家对MATLAB这款软件更加熟悉了,MATLAB是必备的计算与分析软件之一,也是研究设计部门解决工程计算问题的重要工具,而且对于理工科学生来讲实用性很强,希望大家可以熟练掌握所介绍的MATLAB的功能,多次熟练运用后,也可以加深对软件的理解。最后希望大家可以在科研的路上过关斩将,一路长虹。

7e76a1ed47f0c4cdbf38a6622a290f76.png 1b4934a7f515a6fd1e26d3e3bda31812.png

编辑:龚伟佳

排版:赵育鹏

校核:李小伟

7a5ba38da7f00781bdea20740b38a478.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值