整理一下博士圈的关于matlab的微博内容 [mathjax] 图床:matab-img/
03-01的微博 matlab的animation
基本操作
- 注释/解除注释:(1) 代码之前用%注释;(2) 注释快捷键CTRL+R;(3) 取消注释快捷键CTRL+T;(3) 块注释%{ text %}
- 清屏:clear all(清除右侧所有的数据);clc(清除command window);close all(关闭所有的图)。
- 对数表示,log(x) %自然对数,log10(x) %以10为底的对数。
- 输出是disp(),不是print函数
- 指数10^5
- 命令窗口换行但是不执行程序,那么按shift+enter
- 查看工作区中的变量,whos命令
- [b,c] = max(a) 求向量a中的最大值以及最大值所在的位置,传递给[b, c]
- 对偶性,disp('abc') 是函数语法,disp 'abc'是命令语法,二者输出结果是一样的,但是前者的适应性更强,因为后者只能接受字符型的输入。比如sin(pi)可以,但是sin pi不行,因为pi是数值型,不是字符型。
- 计时:tic..........toc分别放在代码首尾。
- 命令窗口点击fx下的点
- help parfor并行池,parfor的语法和for一样,第一次打开会比较慢,以后运行就会比较快。可以在主页-parallel这里设置parfor pool。parfor不能用在嵌套循环的情形。
实时编辑器
- matlab帮助文档,就是用实时脚本编写的。
- 可以用Alt + Enter实现文本和代码的切换。
- 插入分节符,然后Ctrl +Enter运行节。
- Ctrl + Alt + Enter开启下一小节编辑环境
- 可以实现同步滚动,如果被不小心关闭了,可以在内容输出栏右键开启。
画图相关
- 颜色:r 红色,g 绿色,b 蓝色,c 青绿色,m 洋红色 ,y 黄色, k 黑色,w 白色
- 标记符号:+加号符 o空心圆 *星号 .实心圆 x叉号符 s正方形 d菱形 ^上三角形 v下三角形 >右三角形 <左三角形 p五角星 h六边形
- 线型:
- 带线型和标记的代码:
plot(x, y, "--r.", "MarkerSize", 30, "linewidth",2) % --r.中--表示双划线,r表示红色,.表示实心圆
- 图例legend
legend('experiment-1','experiment-2','experiment-3','FontSize',12) legend boxoff; %去掉边框
- 轴标注的数字和label的大小
set(gca,'FontSize',13) set(gca,'xtick',[0:2:27]) xlabel('Holding Time (min)','fontsize',15) ylabel('Normalzied Reflected Intensity','fontsize',15)
- 只显示部分曲线显示legend
h1=plot(x1,y1); h2=plot(x2,y2); h3=plot(x3,y3); h4=plot(x4,y4); legend([h1 h3],'x1-y1','x3-y3');
- 画图的线性区分实例:由于matlab中,对于线型默认是细实线,所以'-r'和'r'表示的意思是一样的。'- -r'画出来的线型就是虚线; '.-r'画出来的线型就是点画线 ;'*r'画出来的线型就是星号连起来的线。
- 图片的保存参考1 参考2
(1)直接file的save as一方面操作麻烦,而且保存的图片清晰度不高
(2)利用saveas(fig,'mmm.jpg')代码,但是不能选择清晰度(gcf是当前图片句柄)% saveas(figure_handle,filename,fileformat) plot(1:10); saveas(gcf,‘myfig.jpg’)
(3) print函数,其实是操作打印机的函数。
% print(figure_handle,fileformat,filename)
print(gcf,'-dpng','abc.png') %保存为png格式的图片到当前路径。不指定保存位置的话,就保存在当前文件夹。x=linspace(1,10,100); y=sin(x); plot(x,y) print(gcf, '-djpeg','-r600',['F:\','mmm.jpg']) % gcf抓取当前图像的句柄
这里如果不用当前figure的句柄gcf,我们可以用fig = figure; 给这个图像整个句柄fig,然后print(fig, '-djpeg','-r600',['F:\','mmm.jpg'])。
png格式:'-dpng'
jpeg: '-djpeg',
tiff: '-dtiff'
bmp: '-dbitmap' - 批量保存图片:其中的600指的是分辨率,后面是指定保存图片的位置。s = num2str(A) 将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量级。num2str 对使用数值为绘图添加标签和标题非常有用。
for i= 1:2 print(i, '-djpeg','-r600',['F:\',num2str(i),'.jpg']) end
- 不同图的绘制:
向量场 (注意 .* 不要忘记点)
%% vector field of g [x,y] = meshgrid(-2:0.2:2,-2:0.2:2); u=2*x.*y; v=x.*x; quiver(x,y,u,v)
stem绘图
x=linspace(-5,5,100); y=sin(x); stem(x,y)
狄拉克Delta函数图
matlab中的dirac(x)命令会让x=0的函数值为无穷大,其他的都为零。我们实际绘制的时候,将x=0处的函数值设为1。下面的代码涉及逻辑判断函数(布尔代数):
x=-10:0.2:10;
y=(x==0); %就是个条件判断,只有x=0的时候,y才为“专1”
stem(x,y);
%%
x = -1:0.1:1;
y = dirac(x);
idx = y == Inf; % find Inf
y(idx) = 1; % set Inf to finite value
stem(x,y)
这里的y起始是由一堆布尔带数值0或1组成的一维向量,那么对于z(y)=4的含义是将原来y中为1的元素全部改写成4,而0元素保持不变。%%下面的那种方法是找到y为无穷大的点的位置,然后赋值1。
数据/函数操作相关(基础入门)
- 数据导入和读取:对于小的文件,直接import data,然后选择numeric matrix,保存为.mat格式的文件,下次要调用,直接load+文件名。
(1) data=load(‘filename.txt’) ; 只能用于导入纯数字的文件,如果含有文字会报错。(这是我导入大数据文件的方式)
(2) data=importdata(‘filename.txt’) ; 既可以读取数据,又可以读取文字。
(3) textread读取法,具体内容见这里。
读取:c=xlsread('data.xls', 'sheet1', 'B2:B5')
(4) 有时候要读取非当前路径下的文件,这个时候往往要添加绝对路径,这个比较麻烦,可以利用addpath("E:\knowledge\Wordpress"),那么这个文件夹中的内容读取和当前路径的内容读取一样的。 - for循环的数据保存:
%一阶for循环保存数值于向量 x=[]; for t=1:10; x(end+1)=3.*t; end %% % 二阶for循环保存数值于矩阵 x=zeros(10, 10); for t=1:10; for m=1:10; x(t, m)=t+m; end end
- [m, n]和[m; n]的区别:
m=1:11; n=20:30; h=[m,n] %得到的是一维数组 %% m=1:11; n=20:30; h=[m;n] %得到的是二位矩阵
- 创建一个函数,并且调用:
计算平均值和方差计算为例子,构建好函数之后,保存的文件名必须和函数名一致。function [m,s] = stat(x) n = length(x); m = sum(x)/n; s = sqrt(sum((x-m).^2/n)); end %% % 命令行输入 values = [12.7, 45.4, 98.9, 26.6, 53.1]; [ave,stdev] = stat(values) %运行之后就可以得到均值和方差
- 随机数
利用下面的函数,调用的时候,比如a=ran([2, 5, 7, 8]),那么这四个元素将会被随机地抽取。%%% m is a vector. We get the random number from the elements of this. function [number]=ran(m) n=length(m); a=rand; for i=1:n % 0-1 is divided into different range if a<i/n number=m(i); break end end
- break的应用:break命令一般和if连用,然后这个if.....break 放在for循环或者while循环中,用于终止for循环或者while循环。举个例子
a=1; for n=1:100 a=a+2; %每次循环+2 if a>100 % 当a不断+2达到101,if判断为真,继续执行if下面的程序 a=a/2; %得到 50.5 break % 终止for循环 end % 和前面的if对应 end
- random函数:具体参见这里R = random('name',A,B,C,D),其中的'name'定义了分布的类型,后面的四个数可以只有一个、两个、三个、四个,根绝不同的分布类型情况不一样。如果我们以“正态分布”为例子,至少有两个数,前面一个数描述的是平均值(mean value),后面一个数描述的是标准差(standard deviation)。
---A= random('Normal',10000); 运行错误,没有标准差
---A = random('Normal',10000, 30); 均值为10000标准差为30的高斯分布,随机取一个数。
---A = random('Normal',10000,30,4); 同上,只是取的随机数组成一个4阶方阵
---A = random('Normal',10000, 30, 4, 5); 同上,只是取的随机数组成一个4*5矩阵如果是离散的均匀分布(Uniform Distribution (Discrete)),那么分布参数只需要一个,就是最大整数,比如random('unid',10)得到的是1-10的均匀分布(取整数)。 - 算数运算
round(2.6)
floor(2.6)
ceil(2.6)
fix(2.6)
fix(-2.6) -
逻辑型和逻辑运算
- 关系运算
- 重新采样
(1) 使用interp1函数,线性插值
y = interp1(initial_x, initial_y, new_x),比如这里的new_x可以设置为0:1:2000,那么新得到的y就是根据原始的y值通过线性插值得到的新的对应于new_x的y值。
(2) 使用spline函数,spline插值
用法和前一个差不多,见实例。
矩阵
(1) 创建矩阵和常用函数
全0矩阵zeros % zeros(1, 4) 创建一行四列的全零矩阵, zeros(4) 四阶
全1矩阵ones % 用法和zeros一样
单位矩阵eye % 如eye(4),eye(3,6)六阶矩阵只取前3行
对角矩阵diag % diag(a) a不同,结果不同
魔方矩阵magic % 每一行/列/对角线加和相等,magic(3)
随机矩阵rand % rand(1, 4)零到1之间的随机分布,一行四列矩阵
上三角矩阵triu % 其他元素为零, 还可以指定偏移量triu(a,2)
下三角矩阵tril % 其他元素为零,还可以指定偏移量tril(a,-1)
(2) 连接矩阵
[a, b] % 平铺连接, 或者用horzcat(a,b)
[a; b] %竖直连接,或者用vertcat(a,b)
repmat(a,1,3) % 对矩阵平铺复制,平铺a一行三列
blkdiag(a,b) %将矩阵a和矩阵b进行分块重组,其余元素设为零
cat(n,e,e) %多维连接,n表示维度,e表示要连接的数据(待续)
(3) 矩阵索引
组合索引A(i,j)
线性索引A(i) %列优先的顺序依次向下索引
sub2ind([n,m],2,3) %组合索引变为线性索引
ind2sub([n,m],8) %线性索引变为组合索引
逻辑索引 %在逻辑为真的位置返回矩阵的元素
size(a) %矩阵a的行数和列数
a(1, [1 3]) % 提取矩阵a第一行的第一个和第三个元素
a( [1 3]) % 索引矩阵a的第一个和第三个元素
a( [1 3;4 5]) % 索引矩阵a的第一个和第三个元素放在第一行.....
a(:) %按照列优先,将矩阵a变为单个数字序列
c=[true false; true false]; b(c) %逻辑索引,c为二阶矩阵
(4) 矩阵元素的修改、删除和添加
修改:既可以用线性索引,也可以用组合索引对矩阵元素进行修改,比如a(2,3)=10或者a(8)=10,其中a为矩阵,进一步地有a(3:4, 4:5) = [1 3; 2 4]。如果组合索引的位置超过原矩阵的大小,那么会对原矩阵进行拓展。
删除: a(:, 2) = [] 删除a矩阵的第二列。不能删除单个元素,否则不能保持矩形,除非a(2) =[]即按照列优先的顺序删除然后输出,不过结果就不是矩阵了,而是数字序列。
(5) 多维数组
3*3*2的多维数组,其中的3*3是三阶矩阵,2表示页面
a = [1 2 3; 4 5 6; 7 8 9];
b = [10 11 12; 13 14 15; 16 17 18];
c = a;
c(:,:,2)= b
% ndims(c) 测试c的维度
% size(c) c的行数、列数以及页面数
% c(:,:,1) =
%
% 1 2 3
% 4 5 6
% 7 8 9
%
%
% c(:,:,2) =
%
% 10 11 12
% 13 14 15
% 16 17 18
四维数组也是采用同样的方法。
zeros(2,2,2)得到三维数组
repmat(10, [2,2,2]) 表示对10这个元素进行两行两列两个页面的平铺
c(1, [1 2],2)表示索引第二个页面,第一行,第一列和第二列的两个元素
(6) 性能优化
说明:
(a) 在使用大型数组时,尽量避免创建不必要的副本
(b) 处理数组容量不断变化的问题时,合理的进行预分配内存
(c) 把代码放入程序文件中,比在命令窗口中,运算效率高。(前者,matlab会自动预估内存区域)
a对应一个数据,如果把a赋值给b,那么a和b还是指向同样的物理地址,如果再修改a那么b对应的物理地址就会变化,也就是会复制未修改前的a的数据,放入到一个新的物理地址中,然后b指向这个新的物理地址。
对于数据a,如果后面要扩大内存空间,为了避免物理内存的不连续性,可以事先指定一大块空白的内存区域,比如a = zeros(300, 300)
注:在内存中,也是将矩阵按照列优先的顺序存储的