Matlab-基础

MIT-Matlab入门
MATLAB Primer

整理一下博士圈的关于matlab的微博内容   图床:matab-img/
03-01的微博 matlab的animation

基本操作

  1. 注释/解除注释:(1) 代码之前用%注释;(2) 注释快捷键CTRL+R;(3) 取消注释快捷键CTRL+T;(3) 块注释%{ text %}
  2. 清屏:clear all(清除右侧所有的数据);clc(清除command window);close all(关闭所有的图)。
  3. 对数表示,log(x) %自然对数,log10(x) %以10为底的对数。
  4. 输出是disp(),不是print函数
  5. 指数10^5
  6. 命令窗口换行但是不执行程序,那么按shift+enter
  7. 查看工作区中的变量,whos命令
  8.  [b,c] = max(a) 求向量a中的最大值以及最大值所在的位置,传递给[b, c]
  9. 对偶性,disp('abc') 是函数语法,disp 'abc'是命令语法,二者输出结果是一样的,但是前者的适应性更强,因为后者只能接受字符型的输入。比如sin(pi)可以,但是sin pi不行,因为pi是数值型,不是字符型。
  10. 计时:tic..........toc分别放在代码首尾。
  11. 命令窗口点击fx下的点
  12. help parfor并行池,parfor的语法和for一样,第一次打开会比较慢,以后运行就会比较快。可以在主页-parallel这里设置parfor pool。parfor不能用在嵌套循环的情形。

实时编辑器

  • matlab帮助文档,就是用实时脚本编写的。
  • 可以用Alt + Enter实现文本和代码的切换。
  • 插入分节符,然后Ctrl +Enter运行节。
  • Ctrl + Alt + Enter开启下一小节编辑环境
  • 可以实现同步滚动,如果被不小心关闭了,可以在内容输出栏右键开启。

画图相关

  1. 颜色:r 红色,g 绿色,b 蓝色,c 青绿色,m 洋红色 ,y 黄色, k 黑色,w 白色
  2. 标记符号:+加号符 o空心圆 *星号 .实心圆 x叉号符 s正方形 d菱形 ^上三角形 v下三角形 >右三角形 <左三角形 p五角星 h六边形
  3. 线型:- 实线(默认) - -双划线 : 虚线 :. 点划线
  4. 带线型和标记的代码:
    plot(x, y, "--r.", "MarkerSize", 30, "linewidth",2)
    % --r.中--表示双划线,r表示红色,.表示实心圆
    
  5. 图例legend
    legend('experiment-1','experiment-2','experiment-3','FontSize',12)
    legend boxoff;   %去掉边框
    
  6. 轴标注的数字和label的大小
    set(gca,'FontSize',13)
    set(gca,'xtick',[0:2:27])
    xlabel('Holding Time (min)','fontsize',15)
    ylabel('Normalzied Reflected Intensity','fontsize',15)
    
  7. 只显示部分曲线显示legend
    h1=plot(x1,y1);
    h2=plot(x2,y2);
    h3=plot(x3,y3);
    h4=plot(x4,y4);
    legend([h1 h3],'x1-y1','x3-y3');
    
  8. 画图的线性区分实例:由于matlab中,对于线型默认是细实线,所以'-r'和'r'表示的意思是一样的。'- -r'画出来的线型就是虚线; '.-r'画出来的线型就是点画线 ;'*r'画出来的线型就是星号连起来的线。
  9. 图片的保存参考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'

  10. 批量保存图片:其中的600指的是分辨率,后面是指定保存图片的位置。s = num2str(A) 将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量级。num2str 对使用数值为绘图添加标签和标题非常有用。
    for i= 1:2
        print(i, '-djpeg','-r600',['F:\',num2str(i),'.jpg'])
    end
    
  11. 不同图的绘制:
    向量场 (注意   .*   不要忘记点)

    %%  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。

数据/函数操作相关(基础入门)

  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"),那么这个文件夹中的内容读取和当前路径的内容读取一样的。
  2. 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
    
  3. [m, n]和[m; n]的区别:
    m=1:11;
    n=20:30;
    h=[m,n] %得到的是一维数组
    
    %%
    m=1:11;
    n=20:30;
    h=[m;n] %得到的是二位矩阵
    

     

  4. 创建一个函数,并且调用:
    计算平均值和方差计算为例子,构建好函数之后,保存的文件名必须和函数名一致。

    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) 
    
    %运行之后就可以得到均值和方差
    

     

  5. 随机数
    利用下面的函数,调用的时候,比如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
    

     

  6. 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
    

     

  7. 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的均匀分布(取整数)。
  8. 算数运算
    round(2.6)
    floor(2.6)
    ceil(2.6)
    fix(2.6)
    fix(-2.6)
  9. 逻辑型和逻辑运算

  10. 关系运算
  11. 重新采样
    (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)

注:在内存中,也是将矩阵按照列优先的顺序存储的

Leave a Reply