这里是几个Matlab的小提示,基本上是我使用Matlab时碰到并解决了的问题,希望能使别人不要再碰钉子走弯路了。如果有建议或发现其中有错误,请与我联系。

循环变量

由于历史的原因,程序员们总是使用i,j,…为循环变量命名,但是在Matlab中这种习惯可能会导致一些很隐蔽的问题。因为i,j同时也是Matlab中的虚数单位,如果你给i赋值,就会覆盖掉原来虚数单位的定义,例如:

4+i*3

ans =

4.0000 + 3.0000i

for i=1:10, end

4+i*3

ans =

34

在一段很长的程序中很难发现这个错误,因此不要用i,j作循环变量名,除非你确认在代码的作用域内不会和复数打交道;或者使用4+3i这样的复数记法;也可以换用j:

for i=1:10, end

i

i =

10

j

ans =

0 + 1.0000i

1i

ans =

0 + 1.0000i

4+3i

ans =

4.0000 + 3.0000i

循环

我经常看到一些Matlab初学者写出带有层层循环的代码,这些代码往往运行得很慢,而且非常难懂。Matlab提供了大量的命令来避免循环,我的建议是:在确定要写一个针对矩阵操作的2重循环之前,请仔细阅读帮助中的Maximizing

MATLAB

Performance一节。里面有很多例子,这里举一个我自己碰到的问题。

要统计数字图像的亮度最大值和最小值,由于数字图像可能是一个二维或三维的矩阵,开始我写出了如下的代码:

switch ndims(img)

case 2

m = max(max(img));

case 3

m = max(max(max(img)));

end

后来我对这种做法很不满意,如果有一个8维的矩阵,难道我要写

max(max(max(max(max(max(max(max(x))))))))

才行?后来我发现无论矩阵是什么维数,实际上

max( x(:) )

就够了。

符号运算

许多Matlab函数(特别是数值计算方面的)可以函数句柄(function

handle)或内联对象(inline

object)作为参数。我们以quad函数为例,这个函数使用Simpson算法求函数的数值积分。它的一种调用形式是:

quad(fun, a, b)

其中,fun可以是指向被积函数的函数句柄,或者含有被积函数的内联对象;a和b分别是被积区间的上、下限。考虑以下积分:

使用函数句柄的方法:

% 将下面到"% EOF"的代码保存为f.m

function y = f(x)

y = sin(x) ./ x;

% EOF

quad(@f, 1, 2)

ans =

0.6593

使用内联对象的方法:

quad( inline(  'sin(x)./x'  )), 1, 2  )

ans =

0.6593

由于使用内联对象不需要另外建立m文件,所以比较方便,建议使用这种方法。

更加常见的应用是被积函数有不确定的参数,例如:

其中参数a,b,K运行时确定,这时,使用函数句柄将显得很麻烦,可以用以下的方法:

a = rand;

b = rand + 1;

K = rand;

y = subs('sin(K*x)/x', 'K', sym(K, 'd') )

quad( inline(vectorize(char(y))), a, b)

y =

sin(.79193703742703536185842949635116*x)/x

ans =

0.8188

当然,由于a,b,K是随机数,结果是不确定的。

这里有有两点需要说明:

第一,请注意sym(K, 'd'),如果直接使用subs('sin(K*x)/x, 'K',

K)或subs('sin(K*x)/x, 'K',

sym(K))的话,高版本的符号工具箱会将K尽可能化为分数,有时这是十分恐怖的,也许会得到:

sin(6649179754310225/9007199254740992*x)/x

这样的结果。

第二,注意vectorize函数。sym对象重载的char函数会把数组的乘除(.*,

./, .^)化成矩阵的乘除(*, /,

^),vectorize会将字符串里的*,/,^全化成.*, ./,

.^,如果不这样做,quad函数将会出错,这个问题曾经困扰了我很长的时间:

quad( inline(char(y)), a, b)

??? Index exceeds matrix dimensions.

Error in ==> D:\MATLAB6p5\toolbox\matlab\funfun\quad.m

On line 67  ==> if ~isfinite(y(7))

隐藏的图形对象属性

Matlab的所谓句柄图形(handle

graphics)对象的配置是通过许多属性的设置来完成的。有一些帮助文件中没有提到的确实存在的属性。

figure的Toolbar属性

有三个值:'none', 'auto', 'figure'

利用这个属性可以把figure变成没有菜单条却有工具栏的样式:

figure('Menubar', 'none', 'Toolbar', 'figure')

root object的Default属性

在我的Malab环境里,Root object有如下的默认值:

get(0, 'Default')

ans =

defaultFigurePosition: [232 258 560 420]

defaultTextColor: [0 0 0]

defaultAxesXColor: [0 0 0]

defaultAxesYColor: [0 0 0]

defaultAxesZColor: [0 0 0]

defaultPatchFaceColor: [0 0 0]

defaultPatchEdgeColor: [0 0 0]

defaultLineColor: [0 0 0]

defaultFigureInvertHardcopy: 'on'

defaultFigureColor: [0.8000 0.8000

0.8000]

defaultAxesColor: [1 1 1]

defaultAxesColorOrder: [7x3 double]

defaultFigureColormap: [64x3 double]

defaultSurfaceEdgeColor: [0 0 0]

defaultFigurePaperType: 'A4'

defaultFigurePaperUnits: 'centimeters'

实际上,还有一些默认值不会被显示出来:

get(0, 'defaultUicontrolBackgroundColor')

get(0, 'defaultUicontrolForegroundColor')

get(0, 'defaultUicontrolFontName')

get(0, 'defaultUicontrolFontSize')

get(0, 'defaultUicontrolFontWeight')

get(0, 'defaultUicontrolFontAngle')

ans =

0.7725    0.7961    0.8118

ans =

0     0     0

ans =

MS Sans Serif

ans =

8

ans =

normal

ans =

normal

这些默认值有助于在创建用户界面时遵循操作系统颜色,例如:

figure('Color', get(0,'defaultUicontrolBackgroundColor'))

system_dependent('getdata')

system_dependent('getwinsys')

版本

使用version函数可以获得Matlab或工具箱的版本:

v1 = ver('matlab')

v1 =

Name: 'MATLAB'

Version: '6.5'

Release: '(R13)'

Date: '20-Jun-2002'

v2 = ver('control')

v2 =

Name: 'Control System Toolbox'

Version: '5.2'

Release: '(R13)'

Date: '28-Jun-2002'

如果工具箱不存在或没有安装返回空结构

v3 = ver('nonsense')

v3 =

0x0 struct array with fields:

Name

Version

Release

Date

可以利用这个函数让自己的程序在不当的Matlab版本上运行时给出比较体面的警告。另外,有一个帮助中没有提及的内部函数system_dependent可以获得操作系统的版本:

system_dependent('getos')

ans =

Microsoft Windows XP

system_dependent('getwinsys')

ans =

Version 5.1 (Build 2600)

uitools工具集

除了帮助中提及的一些GUI工具函数外,matlabroot\toolbox\matlab\uitools里还有不少帮助里没有提及的函数,建议仔细研究一下(help

uitools),例如,makemenu函数可以从字符串中生成菜单:

labels = str2mat( ...

'&File', ...

'>&New^n', ...

'>&Open', ...

'>>Open &document^d', ...

'>>Open &graph^g', ...

'>-------', ...

'>&Save^s', ...

'&Edit', ...

'&View', ...

'>&Axis^a', ...

'>&Selection region^r' ...

);

calls = str2mat( ...

'', ...

'disp(''New'')', ...

'', ...

'disp(''Open doc'')', ...

'disp(''Open graph'')', ...

'', ...

'disp(''Save'')', ...

'', ...

'', ...

'disp(''View axis'')', ...

'disp(''View selection region'')' ...

);

handles = makemenu( figure('Menubar', 'none'), labels,

calls);

matlab错误原因,matlab常见错误分析相关推荐

  1. c51单片机汇编语言语法错误,[计算机]汇编语言常见错误分析.doc

    [计算机]汇编语言常见错误分析.doc 单片机汇编语言常见错误分析 2009年07月12日 星期日 1244单片机汇编语言常见错误分析发布 2009-4-04 0027 | 作者 hnrain | 查 ...

  2. matlab错误打印,MATLAB中数据输出格式出现错误?

    close all clear all fidin=fopen('20131118B.txt');                 %打开文件one minute fidout=fopen('data ...

  3. java任务运行报401错误原因_401的错误分析

    在接口的测试中,经常会遇到客户端向服务端发送一个请求,服务端返回401的错误,那么今天本文章就来说明在接口测试中如何分析以及解决该问题. 我们知道在HTTP返回的状态码中,401错误表示的是被请求的页 ...

  4. c语言程序设计的一般错误的是,《C语言程序设计》第十章 程序常见错误分析.pdf...

    第十章 程序常见错误分析 第十章 程序常见错误分析 C 语言是一种方便灵活.功能性很强的程序设计语言,但是对于初学者很难掌 握,尤其是出了错还不知道错误在哪儿,这是由于 c 编译程序对语法的检查不如其 ...

  5. MATLAB错误:‘conv2’

    MATLAB错误 Undefined function 'conv2' for input arguments of type 'double' and attributes 'full 3d rea ...

  6. matlab错误使用assert,关于异常处理:何时在Matlab中使用assert()?

    由于Matlab被解释,通常会在执行函数签名的函数开头花费大量时间. 例如 if nargin ~= 2; error('must provide two input args a and b'); ...

  7. MATLAB错误使用 surf (第 71 行) X、Y、Z 和 C 不能是复数。解决办法。

    MATLAB错误使用 surf (第 71 行)X.Y.Z 和 C 不能是复数. surf(X,Y,Z) 创建一个三维曲面图,它是一个具有实色边和实色面的三维曲面.该函数将矩阵 Z 中的值绘制为由 X ...

  8. matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。

    matlab打开后提示: 错误使用 connector.internal.autostart.run输入参数的数目不足 原因:自己写的一个函数和matlab自带的函数重名了 参考:警告: 在 matl ...

  9. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....

    [标题]             ASP.NET常见错误,原因及解决方法[错误提示]    异常详细信息: System.Net.WebException: 请求因 HTTP 状态 401 失败:Un ...

最新文章

  1. MySQL初始化root密码以及root密码忘记解决方法
  2. Python 内建函数
  3. 手机开机画面制作工具(LogoBuilder)
  4. Java分布式篇5——FastDFS
  5. UI设计师必定需要了解的sketch素材
  6. win11原版iso如何安装 Windows11原版iso安装步骤方法
  7. Linux:程序设计
  8. centos 安装gcc
  9. 提交太多oracle,急!!请教 用文本域向数据库oracle提交不了太多文字如何解决??...
  10. java的oracle考试认证(OCJP)之路
  11. android listview 获取viewholder,Android ViewHolder 的基本使用
  12. 6-1 Iterative Mergesort (25分)
  13. 手摇计算机发展年代,你知道“手摇式”的计算机吗?你肯定不知道
  14. FX DocuCentre S2520~~富士施乐 DocuCentre S2520和2022打印机驱动安装
  15. Linux网络之DHCP
  16. (C语言)对称数判断
  17. python中cv2.putText参数详解
  18. Symantec Backup Exec Agent For Linux防火墙问题
  19. 教育部:三年来各省份向校园足球累计投入200亿元
  20. 授予数据库账号dba权限_oracle数据库限制dba权限

热门文章

  1. BZOJ 2759 一个动态树好题 (LCT)
  2. java 判断是否整形_java判断是否基本类型
  3. cuda nvcc版本不一致_入坑第一步:Win10安装cuda+cuDNN+TensorFlow-GPU走过的那些路
  4. python映射类型list_python中标准数据类型:数字 string(字符串) list(列表) tuple(元组) dict(字典) sets(集合)共同点和区别:...
  5. javascript终极屏蔽右键/禁止复制/禁止另存/禁止右键/禁止选取/禁止粘贴的方法...
  6. Leetcode代码练习(三)
  7. hdu 4982 贪心构造序列
  8. 6.二元查找树的后序遍历结果[PostOrderOfBST]
  9. Core Location定位
  10. 三行代码实现阿拉伯数字转中文大小写转