在编写matlab代码时,我经常会用到一些简单的功能,但是有些语句每次都记不住,每次都要重新百度!!今天,我终于克服懒惰,决定一劳永逸,写这篇文章来汇总我经常用到的一些语句和功能模块,持续更新,也为兄弟姐妹们进行matlab仿真助一臂之力。(如有侵权,请联系我,我会删掉或注明出处的)
set(gca,'Position',[0.12 0.12 0.85 0.8]);
[]内的数字分别代表[左边距 下边距 图宽 图高],[0.12 0.12 0.85 0.8]组合我经常用,设置后图的比例看起来还不错。
set(gcf,'unit','centimeters','position',[10 20 50 10]);
[]内的数字分别表示:
[figure左边缘距电脑屏幕左边缘的距离 figure下边缘距电脑屏幕下边缘的距离 figure图的长 figure图的高],单位为cm。
(碎碎念:这句话很有用,就比如我经常在持续时间很长的循环里,每个循环生成两幅图,如果提前设置两幅图在不同的位置,我就可以:电脑运行i=1时我发呆,电脑运行i=2时我看i=1的两幅图(还不用专门挪开看下面的图!),电脑运行i=3时我看i=2的图......可以说非常完美了~)
这也很有用,因为有时候子函数很多,需要用子文件夹来分类,那么我们必须要在主函数起始位置先写上增加子文件夹路径的语句。
addpath 发送端函数/
子文件夹叫什么名字,就:addpath 子文件夹名字/
addpath(genpath(pwd))
这个语句可以把文件夹内所有的子文件夹都添加进运行路径中,就不用再一个一个文件夹添加啦~
dbstop if error
相信大家都遇到过这个问题,运行了好半天的代码,出错后除了系统的报错信息,我们还想知道出错前每个变量的值是多少,可以帮助我们更快的debug,而我们在主函数最一开始写下这句话,系统就会保存出错前,每个变量的值,把鼠标轻轻放在变量上,它的值就可以显现出来啦,这功能有用哭了~
实现这一功能的函数如下:
function save_to_word(f)
%% 打开word
filespec_user = 'F:\文档\仿真图.docx';
% 判断Word是否已经打开,若已打开,就在打开的Word中进行操作,否则就打开Word
try
% 若Word服务器已经打开,返回其句柄Word
Word = actxGetRunningServer('Word.Application');
catch
% 否则,创建一个Microsoft Word服务器,返回句柄Word
Word = actxserver('Word.Application');
end
Word.Visible = 1;
% 若测试文件存在,打开该测试文件,否则,新建一个文件,并保存,文件名为测试.doc
if exist(filespec_user,'file')
Document = Word.Documents.Open(filespec_user);
else
Document = Word.Documents.Add;
Document.SaveAs2(filespec_user);
end
%%
Content = Document.Content;
for i = 1:length(f)
hgexport(f(i), '-clipboard');%figure的句柄为“zft”
Selection=Word.Selection;
Selection.Start = Content.end;
Selection.Range.Paste;%在当前光标的位置插入图片
Selection.Start = Content.end;
Selection.MoveDown;
end
end
函数的输入f为所保存的图的句柄,那如何调用这个函数呢?举个栗子:
f1 = figure;plot(x,y);
save_to_word(f1);
%也可实现一次性多图保存,使用示例;
f1 = figure;plot(x1,y1);
f2 = figure;plot(x2,y2);
save_to_word([f1,f2]);
小提示:你可以在save_to_word.m函数中任意改变你想保存的word文档路径和文档名称,并且这个函数可以自己创建word文档,不需要你提前创建空文档。
(碎碎念:这个函数可以说非常有用了,想象一下你一下生成了100幅图,你还都想保存下来,总不能一张一张复制粘贴到文档里吧~事实就是,在我知道这个函数之前,我就是这么做的,哭死了,)
实现这一功能的函数如下:
function save_to_word1(para)
%% 打开word
filespec_user = 'F:\文档\仿真结果.docx';
% 判断Word是否已经打开,若已打开,就在打开的Word中进行操作,否则就打开Word
try
% 若Word服务器已经打开,返回其句柄Word
Word = actxGetRunningServer('Word.Application');
catch
% 否则,创建一个Microsoft Word服务器,返回句柄Word
Word = actxserver('Word.Application');
end
Word.Visible = 1;
% 若测试文件存在,打开该测试文件,否则,新建一个文件,并保存,文件名为测试.doc
if exist(filespec_user,'file')
Document = Word.Documents.Open(filespec_user);
else
Document = Word.Documents.Add;
Document.SaveAs2(filespec_user);
end
%%
Content = Document.Content;
Selection = Word.Selection;
Selection.Text = num2str(para(1,:));
Selection.Start = Content.end;
Selection.MoveDown;
Selection.TypeParagraph;
end
函数的输入para为你想保存的语句,那如何调用这个函数呢?举个栗子:
save_to_word1('这句话可以保存到word中'); % 展示了如何保存一句话
save_to_word1(['他的年龄为:',num2str(age)]); % 展示了如何保存变量
小提示:你可以在save_to_word1.m函数中任意改变你想保存的word文档路径和文档名称,并且这个函数可以自己创建word文档,不需要你提前创建空文档。
这个函数可以和save_to_word.m函数结合着使用,用于在众多的figure中做区分,也可用于备注每个figure对应的变量大小,可以说用处非常大啦~
过滤波器可以直接使用函数filter实现,也可以通过卷积实现,假设原信号为x,滤波器系数为filter_coef,则
第一种方式:
x = [zeros(1,length(filer_coef)-1) x]; % 需要先加长原始信号,在前面补length(filer_coef)-1个零
xx1 = filter(filer_coef,1,x);
第二种方式:
x = [zeros(1,length(filer_coef)-1) x];
xx2 = zeros(1,length(x));
for i = length(filer_coef):length(x)
xx2(i) = x(i-length(filer_coef)+1:i) * filer_coef';
end
举个栗子:(实际上这是一个实现信号2倍上采样的代码,2倍上采样包含补零和过滤波器两个步骤,但这里的重点是滤波器的使用,所以不再赘述2倍上采样的相关知识。)
close all
clc
clear all;
%% 准备工作
%------------ 生成信号频域start ---------------%
pream_pha = [
0 7 10 15 11 9 2 5 10 2 15 11 13 0 13 14 ...
13 12 7 9 14 7 8 5 0 11 6 2 15 1 12 6 ...
0 9 13 6 15 7 0 2 12 4 3 4 9 11 8 14 ...
9 3 9 7 14 7 15 5 11 3 8 11 10 9 7 0 ...
13 1 4 15 5 11 3 4 9 10 1 10 0 9 1 0 ...
5 3 0 1 13 6 8 11 1 10 8 14 13 12 8 14 ...
10 2 1 11 0 1 10 3 4 7 3 11 3 4 2 11 ...
0 1 15 11 6 10 14 9 12 13 1 5 11 7 0 10 ...
3 13 4 6 7 0 2 14 11 9 7 6 8 2 9 8 ...
10 14 2 14 6 10 12 7 11 7 11 12 15 5 6 10 ...
5 14 6 12 3 12 3 11 8 6 3 1 0 11 10 11 ...
13 3 5 3 4 1 12 11 15 7 15 2 5 13 5 12 ...
1 6 11 13 1 3 5 15 10 6 2 1 8 9 5 8 ...
10 6 8 9 7 15 8 4 3 13 14 3 0 4 2 0 ...
8 6 4 13 3 8 0 12 1 7 0 2 5 8 7 4 ...
10 12 13 12 0 2 11 5 2 5 6 7 0 10 9 11 ...
12 13 15 0 12 11 7 6 5 2 13 12 1 6 11 0 ...
1 7 10 7 4 8 0 11 1 8 0 7 11 0 2 12 ...
4 9 0 5 10 15 7 10 1 5 10 15 5 14 8 14 ...
7 14 7 0 5 8 6 11 15 11 6 4 7 8 11 15 ...
11 4 9 15 12 4 15 7 1 14 15 1 2 11 9 11 ...
1 5 10 6 5 4 0 19 14 0 7 11 15 6 9 11 ...
7 2 9 4 11 15 11 12 0 13 11 9 2 9 0 5 ...
6 11 13 2 12 10 8 11 7 11 15 9 1 19 1 9 ...
1 10 9 10 12 13 12 10 9 10 11 10 8 7 8 9 ...
8 13 0 12 0 6 7 6 1 14 9 2 11 12 4 5 ...
1 8 13 2 9 7 6 5 1 8 14 4 12 6 15 1 ...
0 14 15 10 11 12 11 12 2 4 5 6 10 12 13 14 ...
5 13 15 4 1 15 6 4 0 15 7 9 15 8 5 2 ...
0 1 2 4 5 6 8 4 3 1 14 4 2 8 0 13 ...
5 2 13 7 11 14 8 2 8 11 2 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
];
band_start = 81; band_end = 300;
Pream_phase = zeros(1,1024);
Pream_phase(band_start:band_end) = pream_pha(band_start:band_end)*(pi/8);
Pream_frq = zeros(1,1024);
Pream_frq(band_start:band_end) = exp(1j*Pream_phase(band_start:band_end));
Pream_frq(1:band_start-1) = 0.035*exp(0);
Pream_frq(band_end+1:end) = 0.035*exp(0);
%------------ 生成信号频域end -----------------%
%------------ 反变换得时域start ---------------%
Pream_time = ifft(Pream_frq,1024);
up2 = zeros(1,length(Pream_time)) + 1j*zeros(1,length(Pream_time));
x = [Pream_time;up2];
x = reshape(x,1,[]);
%------------ 反变换得时域end -----------------%
%% 两种滤波方法
filer_coef = [13 0 -64 0 308 511 308 0 -64 0 13]/norm([13 0 -64 0 308 511 308 0 -64 0 13],2);
x = [zeros(1,length(filer_coef)-1) x];
%----------过滤波器方法一-------------------------------------------------%
xx1 = filter(filer_coef,1,x);
%----------过滤波器方法一end----------------------------------------------%
%----------过滤波器方法二-------------------------------------------------%
xx2 = zeros(1,length(x));
for i = length(filer_coef):length(x)
xx2(i) = x(i-length(filer_coef)+1:i) * filer_coef';
end
%----------过滤波器方法二end----------------------------------------------%
%% 画图验证
freqz(filer_coef);title('滤波器');
figure,
subplot(211);plot(abs(x));xlabel('频率(单位:MHz)');title('原始信号幅值');grid on;
subplot(212);plot(angle(x));xlabel('频率(单位:MHz)');title('原始信号相位');grid on;
figure,plot(abs(fft(x)));xlabel('频率(单位:MHz)');title('原始信号频谱幅值');grid on;
figure,
subplot(211);plot(abs(xx1));xlabel('频率(单位:MHz)');title('滤波信号频谱幅值(方法一)');grid on;
subplot(212);plot(angle(xx1));xlabel('频率(单位:MHz)');title('滤波信号频谱相位(方法一)');grid on;
figure,plot(abs(fft(xx1)));xlabel('频率(单位:MHz)');title('滤波信号频谱幅值(方法一)');grid on;
figure,
subplot(211);plot(abs(xx2));xlabel('频率(单位:MHz)');title('滤波信号频谱幅值(方法二)');grid on;
subplot(212);plot(angle(xx2));xlabel('频率(单位:MHz)');title('滤波信号频谱相位(方法二)');grid on;
figure,plot(abs(fft(xx2)));xlabel('频率(单位:MHz)');title('滤波信号频谱幅值(方法二)');grid on;
上述代码画图为:
未完待续,不犯懒的时候持续更新......
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...