matlab的一些使用技巧和注意事项 (不断更新中)

注意事项:


  1. 避免使用一些运行效率低的代码结构
  • 避免使用for循环,改用矢量运算或者parfor循环并行运算
x = 0:0.1:1;
for i = 1:length(x)
y(i) = sin(x(i));
end

改为矢量运算如下:

x = 0:0.1:1;
y=sin(x);

改为parfor循环并行运算如下:

x = 0:0.1:1;
parfor i = 1:length(x)
y=sin(x(i));
end

parfor 的使用与 for 相似,但是有其他的要求,具体使用方法参见parfor的使用


  • 矩阵预分配大小,优先列运算
x=0:0.1:1;
for i = 1:length(x)
y(i) = x(x);
end

可以修改为:

x=0:0.1:1;
y=zeros(length(x) , 1);
for i = 1:length(x)
y(i) = x(x);
end

在未预分配内存的情况下,每一次赋值相当于将原矩阵扩充,然后将原数据复制进去再将新数据复制进去,而预分配的情况下可以直接复制进原矩阵。


MATLAB的内存存储方式是按列顺序存储的,在遍历或者循环的情况下,应该优先访问同一列中的元素,例如:

tic;
x=ones(5000,5000);
y=zeros(5000,5000);
for i = 1:5000
  for j = 1:5000
       y(i,j) = x(i,j);
  end
end     
toc

可以修改为:

tic;
x=ones(5000,5000);
y=zeros(5000,5000);
for i = 1:5000
  for j = 1:5000
       y(j,i) = x(j,i);
  end
end     
toc  
时间已过 0.544052 秒。
时间已过 0.231383 秒。

  • 能用乘法的地方不要用除法
    这个是由于计算机的原理造成的,除法永远比乘法容易造成精度损失并且耗时更长,在进行大量重复计算时,优先使用乘法而不是除法。
x = 1;
y = x*2;
y = x/0.5;  % 显然前者要更快
  • 用for循环替代while循环
    在matlab里面,for循环的速度是远远快于while的(c/c++中相差不大)。因此,尽量用for而不是while。如果空间不足,就用while吧

  • 在&&和||能够替代 & 和 | 的时候,优先使用&&和||
    普通逻辑判别会判断两边的逻辑值,而&&和||能够在逻辑值已经决定时忽略后面的结果。

  • 合理使用稀疏矩阵sparse
    在矩阵元素很多都为0时,可以使用稀疏矩阵,其运算速度要快的多

  • 及时释放不用的变量
    如果存在大量临时变量(用的次数不多),会使得连续内存空间变少,分配大规模矩阵(或reshape运算)不能保证成功。因此应该避免。

  • 不要再同一行中写入多个命令,加上分号后记得换行


  1. 避免使用效率低的函数
  • 避免使用eval函数
    eval函数虽然可以把字符串当做命令来执行,但eval 函数的许多常见用法的效率不如其他 MATLAB 函数和语言构造高效,更难阅读和调试。

    • MATLAB 会在您首次运行代码时对代码进行编译,以增强以后运行的性能。但是,由于 eval 语句中的代码可在运行时更改,因此无法进行编译。

    • eval 语句中的代码可能会意外创建变量或为当前工作区中已存在的变量赋值,并覆盖现有的数据。

    • eval 语句中的串联字符向量通常难以阅读。其他语言构造方式可以简化您代码中的语法。

    尽可能不在 eval 函数的输入中包含输出参数,例如 eval(['output = ',expression])。首选语法,output = eval(expression), eval函数的常见替代方法请见官方介绍

  • 直接用符号代替inv函数

A = B*C
B = A*inv(C);
B = A/C;   % 相对而言直接用算数符号运行速度更快
  • 用logical函数代替find函数
  • 二者都可以用来寻找符合条件的元素,但是logical函数的运行速度要比find函数快
A = magic(3)l
A(find(a==3)) = 1;
A(logical(a==3)) = 1;   % 使用logical要好一些
  • 用find函数代替ismember函数
    对元胞数组操作是,为了找到元胞数组元素是否是某个值,可以使用ismember函数,但是在某些情况下可以使用find
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
tic;
ind = find(ismember(str,'KU'));
toc
% 修改为使用find函数
tic;
find(strcmp('KU',strs));
toc
时间已过 0.001976 秒。
时间已过 0.000014 秒。
  • 用strcmp函数代替strmatch函数
  • 用str2double函数代替str2num函数

使用技巧:

  • 常用快捷键
  • 多行注释 【Ctrl + R】(不可折叠)
%{
可折叠的注释区域
%}
  • 取消多行注释 【Ctrl + T】
  • 撤销上一步 【Ctrl + Z】
  • 复制、粘贴、剪切 【Ctrl + C/V/X】
  • 自动补全名称【Tab】
  • 自动缩进 【Ctrl + L】
  • 终止程序 【Ctrl + C】
  • 格式化代码 【Ctrl + I】
  • 在命令行中换行 【Shift + Enter】

  • 调试技巧
  • 函数使用帮助 help
  • 查看函数文档 doc
  • 查看中间变量 去掉分号
  • 忽略warning warning off
  • 程序出错暂停 dbstop if error
  • 编辑函数 edit
  • 自动关机 shutdown
  • 退出MATLAB exit 或 quit
  • 获取当前路径:pwd
  • 获取当前目录文件 ls 或 dir

… 持续更新中…

发布了50 篇原创文章 · 获赞 66 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43157190/article/details/99956947