matlab笔记

好的编程习惯

1.脚本功能及版本的注释

  1. %% lickInterval
  2. % 脚本文件:lickinter.m
  3. %
  4. % 目的:
  5. % 统计lick的间隔并作直方图,挑选出小于100mslick,匹配其lick的绝对时间和licktype
  6. %
  7. % 修改记录:
  8. % 日期 作者 描述
  9. % ======== === ==============
  10. % 21/05/17 pxt 统计lick的间隔,画出间隔在0-300ms内的直方图。
  11. % 21/07/10 zkx 增加:可以画出间隔在0-10000ms的直方图;挑出小于100mslick,及其对应的licktype,计算小于100mslick占所有lick的比例。
  12. %
  13. % 定义变量
  14. % output --表格,读入的数据txt
  15. % ilick --向量,lick的绝对时间
  16. % intlick --向量,lick的间隔时间
  17. % histall --直方图,间隔在0-10000ms
  18. % hist --直方图,间隔在0-300ms
  19. % ilick100 --x3矩阵,列1:小于100mslick的绝对时间;列2:小于100ms的间隔;列3licktype
  20. % ilick100resp --标量,小于100msResp Lick数目
  21. % ilickrate --标量,小于100mslick占所有lick的百分比

2.注释
单行注释 %
多行注释 %{ %}

常用操作

help 函数名\命令
lookfor 可以查找到描述中的文件

清空缓存

  • close all关闭所有窗口
  • clear清除工作区所有变量 clear var特定变量
  • clc清除命令行窗口
  • clf清空当前图像窗口中内容

工作区

  • whos查看工作区变量
  • save filename var1 var2保存工作区变量
  • load filename将 MAT 文件中的数据还原到工作区

    命令行

  • diary filename\ diary on\ diary off 记录命令行的文本(包括输入输出报错),可以用来打草稿

    调试

    ?abort ctl+c
    ?!

    启动与关闭设置?finish

文件读写

搜索路径 ?finish

搜索路径的顺序

  1. 是否为变量名,是即输出变量的数值
  2. 是否是内建函数或命令,是即执行
  3. 是否是当前目录下的m文件,是即执行
  4. 是否是matlab搜索路径的所有目录下的m文件,是即执行

找到正在执行的文件版本和路径

  • which filename 输出该文件的路径

将文件夹添加到搜索路径中

  • addpath
  • savepath save current search path
  • path2rc 添加当前目录到matlab搜索路径
  • rmpath 移动 ```matlab %% 将文件夹添加到搜索路径最前面 mkdir(‘matlab/myfiles’)
    addpath(‘matlab/myfiles’) savepath savepath matlab/myfiles/pathdef.m %保存在该文件夹的路径文件中 %不过我用的路径文件只有一个,不是每个文件中都有,C:\ProgramFiles\Polyspace\R2020a\toolbox\local\pathdef.m %每次退出前保存当前路径到搜索路径,finish.m文件

%% 将文件夹添加到搜索路径最后面 mkdir(‘matlab/myfiles’) addpath(‘matlab/myfiles’,’-end’) savepath

%% 将文件夹及其子文件夹添加到搜索路径 mkdir(‘matlab/myfiles’) addpath(genpath(‘matlab/myfiles’)) savepath

此外,oldpath = addpath(_) 返回在添加指定文件夹之前的路径。


-  pwd 显示当前目录
- cd 进入目录
-  dir 列出目录内容,mac系统文件夹注释文件除了.,..,还有一个自带的.DS_Store,所以实际上自己储存的文件是从第4个开始 

```matlab
MyFolderInfo = dir('myfolder')
MyFolderInfo= filenumber×1 struct array with fields:
    name
    folder
    date
    bytes
    isdir%is it a folder, 1 for yes
    datenum
  • mkdir()新建文件夹
  • fullfile从各个部分构建完整文件名f = fullfile(filepart1,…,filepartN) ,filepart需要是字符串

    txt、csv文件

    readtable

    缺失值 matlab默认形式,numeric为NaN,char为0X0 char
    readtable(filename,’Delimiter’,’\t’)指定分隔符
    readtable(filename,’Format’,’%s’)指定读入数据的变量类型,%s char变量类型
    readtable(filename,’Format’,’auto’)将数据全部作为char读入,同时可以将headers作为数据读入table,缺失值作为0X0 char

    mat文件

    保存图片

  • print -dtiff image.tif 保存tiff格式图片

    格式化输出

  • format命令

  • fprint(format,data) %d整数%e科学计数法%f浮点数(%6.2f占有6个字符宽度,保留两位小数的浮点数)\n换行
  • disp(数组)虚数的时候用,因为fprint只能显示复数的实部

数据类型

  • double型:64位双精度浮点数,可以代表实数虚数和复数
  • 字符数组char:每16位数代表一个字符,单引号,双引号;数组的每个元素都包含单个字符
  • 字符串string->字符串数组:单引号,双引号;一对‘’是1x1的size

    • 字符串长度strlength()
    • 将数据格式化为字符串 str = sprintf(formatSpec,A1,…,An) ,formatSpec是格式控制符号
    • 将数组格式化为字符串组compose 函数可以字符串数组或字符向量元胞数组形式返回多个格式化文本段,这一点与 sprintf 不同。sprintf 函数只返回一个字符串标量或字符向量。
    • 将格式化文本写入文件中fprintf(fileID,formatSpec,A1,…,An)
  • 格式转换num2str char() double()

  • 预定义变量(取变量名时避开):pi,i\j虚数,lnf无穷大,clock年月日时分秒,date日月年,eps,ans
  • !无逻辑数据型或布尔型,将0值结果作为false,非0结果作为true

数据操作

matlab的数据结构只有数组

数组每一行每一列元素个数必须完全相同

  • 数据和矩阵的运算不同,数据运算.
  • size得到行列数, size(A,dims) dims选择求size的维度
  • 创建:ones(行,列),zeros,eyes单位矩阵,直接创建一个内容(未定义的初始化补充为0),冒号填充range(开始:步长:结束)\input

    A=zeros(2,3)
    A(1,:)=0:2
    A =
    0     1     2
    0     0     0
    
  • 串联:水平A = [a,a],竖直A = [a; a]

  • 数组索引:二维下标A(4,2),单一下标A(8),列出 A 前三行及第二列中的元素:A(1:3,2) ,可以用end表示最大的坐标值*试图使用单一坐标访问时注意,顺序是matlab的储存顺序,是按列排列的
  • 更新数组内部分值的时候:通过相同大小的子数组更新

描述性统计

  • 最大值 [maxval index] = max([1 2 3 4])返回maxval=6,index=4

逻辑运算

& 矩阵与,首先判断A的逻辑值,然后判断B的值,然后进行逻辑与的计算。A和B可以为矩阵(e.g. A=[1 0],B=[0 0])。
&& 逻辑值与,首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值。A和B不能是矩阵,只能是标量。
&是按矩阵位与,输出矩阵。&&是逻辑值与,最后输出单个0/1。
| 矩阵或
|| 逻辑值或,首先判断A的逻辑值,如果A的值为真,就可以判断整个表达式的值为真,就不需要再判断B的值。
~ 非

比较运算

因为matlab中每个数据都是数组

  • 数组和一个数比较,结果数组中每个元素的逻辑值
  • 数组和相同大小的数组比较,结果数组中每个元素的逻辑值
  • 字符串和相同大小的字符串比较(因为matlab中字符串也是以数组形式保存的)
  • 比较一个数和表达式时也需要小心,因为表达式可能是一个round off的值。可以改写成abs(a-b)<e-14(round off的错误范围)

画图

title()
xlabel()
ylabel()
legend(‘legend1’,’legend2’.pos) pos是一个整数,指示图例放的位置,0自动找最佳,1右上角
plot(x,y,’颜色字母|标记类型|线条类型’)作图时可以设置颜色线条样式数据点样式
在同一坐标系内作图
x值相同 plot(x,y1,x,y2)
x值不同 hold on

选择及分支结构

后面要接end结尾

if

条件特点:exp关系或逻辑运算,0或非0

执行顺序:在一个if结构中,可以有任意个elseif语句,但else语句最多只有一个。只要上面的一个exp为0,就检测下一个,一旦其中有一个为非0,对应的block就执行。然后跳到end之后的语句执行。
如果所有exp都为0,那么程序会执行else语句,然后跳到end之后的语句执行。
如果程序没有else语句,程序跳到end之后的语句执行,而不会执行if里的部分。

嵌套关系:翻译器把end和与它最近的if联系在一起,若缺失会出错。

%多个分支
if exp
    statement;
elseif exp
    statement;
elseif exp
    statement;
else
    statement;
end
%if的嵌套
if exp
    statement;
    if exp
    statement;
  end
end

switch

条件特点:exp可以是单精度整数,字符或逻辑表达式

执行顺序:exp等于exp n时会执行statement n,然后跳到end后语句,otherwise和else作用相同。

多个条件相同结果:可在同一个case中用{}括起来所有条件,如果分开case写,只能执行第一个case。

switch(exp待选择case的表达式)
case exp1
    statement1;
case {exp2, exp3}
    statement2;
otherwise,
    statement3;
end

try/catch

try
    statement1;
catch
    statement2;
end