QQ登录

只需要一步,快速开始

 注册地址  找回密码

tag 标签: 编程语言

相关帖子

版块 作者 回复/查看 最后发表
运筹学建模,算法计算机实现,最简单的编程语言Python attachment 运筹学 Seawind2012 2012-5-19 2 6218 他山石 2013-7-12 23:57
学习程序设计就这样简单,8条经验让你了解全部编程语言 attach_img Java wangzheng3056 2013-8-8 9 2799 Create_our_futu 2013-11-1 21:13
LaTeX技巧560:LaTeX如何用listings定制输出Scala编程语言 attachment LaTeX/ScienceWord论坛 梦里花111 2013-12-19 0 1456 梦里花111 2013-12-19 17:39
编程语言之间的交叉应用 attachment 语言类综合讨论版 xian土豆包子 2014-1-22 0 1955 xian土豆包子 2014-1-22 11:00
Java编程语言.(第三版) - [!price! 2 点体力] attachment Java 美凌格 2014-1-29 0 7311 美凌格 2014-1-29 22:02
编程语言会影响程序员的性格吗? 建议交流区 爱是你我 2015-5-4 0 1415 爱是你我 2015-5-4 10:01
javascript 是函数式编程语言吗? 建议交流区 爱的奉献 2015-5-4 1 1443 fox 2015-5-4 15:24
15其他编程语言结合 attachment 数模资源交流 建模人生 2015-9-1 2 1718 建模人生 2015-9-1 20:05
推荐一个在线编程小工具,支持C/C++/Java/Matlab/TCL/Php/Python/Perl/Ruby等语言 美国大学生数学建模竞赛(MCM/ICM) tianpengyun 2015-11-18 0 0 tianpengyun 2015-11-18 12:49
MATLAB语言编程介绍 attachment 数模经验分享 liyan1259 2015-12-5 10 2835 shuqi 2015-12-21 12:43
为什么R是你下一个要学的编程语言? attach_img 数据分析 吃苹果的梨 2016-5-20 2 2116 MH6174 2016-6-10 12:33
【5.22】为什么R是你下一个要学的编程语言? attach_img 微信公众平台 西北狼666 2016-5-22 98 11096 niezhixin 2016-7-11 22:33

相关日志

分享 MATLAB常见错误汇总
ML2 2013-8-18 15:51
Matlab 常见语法错误 Subscript indices must either be real positive integers or logicals 中文解释: 下标索引必须是正整数类型或者逻辑类型 出错原因: 在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注: matlab 的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。 解决办法: 自己调试一下程序,把下标为 0 或者负数的地方修正。关于矩阵的各种访问方式。 举例: 【错误代码】: 1. for s = 0:0.2:2 2. a(s) = 4 * s - 1; 3. end 复制代码 【正确代码】: 1. 2. for s = 1:10 3. a(s) = 4 * s - 1; 4. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 Undefined function or variable "a" 中文解释: 函数或变量 a 没有定义 出错原因及解决办法: 1. 如果 a 是变量,则 参见 写给学习 matlab 的新手们 一贴中技巧 6 后半部分 2. 如果 a 是函数,则这是因为 matlab 在所有已添加的路径中都无法找到该函数对应的 m 文件而导致的,对此,把该 m 文件移动到当前路径下再运行便可。(注:何谓 “ 所有已添加的路径 ”—— 在命令窗口中输入 pathtool 可以查看;何谓 “ 当前路径 ”—— 在命令窗口中输入 pwd 可以查看) 举例: myPlus.m : 1. function d = myPlus(a,b) 2. d = a + b; 复制代码 【错误调用】: 命令窗口: 1. z = myPlus(a,b) 复制代码 【正确调用】: 命令窗口: 1. x = 2; 2. y = 5; 3. z = myPlus(x,y) 复制代码 Input argument "x" is undefined 中文解释: 输入变量 x 没有定义 出错原因及解决方法: 参见 写给学习 matlab 的新手们 一贴中技巧 6 举例: 1. function y = myTest(x) 2. y = x * 2; 复制代码 【错误调用】: 直接在 m 文件编辑窗口运行程序,或者命令窗口: 1. a = myTest; 复制代码 【正确调用】: 1. b = 4; 2. a = myText(b); 复制代码 Matrix dimensions must agree Inner matrix dimensions must agree 中文解释: 矩阵的维数必须一致 出错原因: 这是由于运算符 (= + - / * 等 ) 两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。 matlab 通过 “.” 来区分矩阵运算和元素运算,对此可以参阅: 写给学习 matlab 的新手们 一贴中技巧 1 解决办法: 自己调试一下程序,保证运算符两边的运算对象维数一致 举例: 【错误代码】: 1. b = ; 2. a = ; 3. c = a*b; 复制代码 【正确代码】: 1. 2. b = ; 3. a = ; 4. c = a.*b; 复制代码 Attempt to execute SCRIPT conv as a function 出错原因及解决办法: 参见 写给学习 matlab 的新手们 一贴中技巧 2 如果经过上述检测后仍然出现错误,则请把 m 文件的路径设置为常规的试试,即不使用中文的路径、不使用数字作为 m 文件名的开头等等 Function definitions are not permitted at the prompt or in scripts 中文解释: 不能在命令窗口或者脚本文件中定义函数 出错原因: 一旦在命令窗口写 function c = myPlus(a,b) ,此错误就会出现,因为函数只能定义在 m 文件中。关于脚本文件和 m 文件的区别请查阅 matlab 基础书。简言之: 1) 如果你写成 function 的形式,那么必须写在 m 文件中,且以 function 开头(即 function 语句前不能包含其他语句,所有语句必须放在 function 中,当然, function 的定义可以有多个,各 function 之间是并列关系,不能嵌套); 2) 如果你写成脚本的形式,则既可以写在命令窗口中,也可以写在 m 文件中,但两者均不能包含 function 语句(即不能进行函数的定义) 解决办法: 新建一个 m 文件,然后再进行函数的定义 1. X must have one or two columns 2. Vectors must be the same lengths 中文解释: 1.X 必须是 1 或者 2 列 2. 向量长度必须一致 出错原因: 1. 实际输入不满足该条件。至于如何判断矩阵的行、列,请参阅高等代数或者 matlab 的基础书籍 2. 输入的两个(或几个)变量长度不满足该条件。例如 plot 函数的前两个输入变量,如果一个是 1*2 ,另一个是 1*3 ,则会出错 解决方法: 都需要自己调试一下 1. 把 X 的维数改为 1 或者 2 列 2. 按照函数的语法要求把向量的长度设置为一样 举例: 【错误代码】: 1. a = ; 2. b = ; 3. plot(a,b); 复制代码 【正确代码】: 1. 2. a = ; 3. b = ; 4. plot(a,b); 复制代码 One or more output arguments not assigned during call to '...' 中文解释: 在调用 ... 函数过程中,一个或多个输出变量没有被赋值 出错原因: 函数如果带有输出变量,则每个输出在返回的时候都必须被赋值。容易出现这个错误的两个地方是: 1) 在部分条件判断语句(如 if )中没有考虑到输出变量的返回值。例子: 多输入多输出报错 2) 在循环迭代过程中部分变量的维数发生了变化。例子: 请几位版主看看这个程序什么错误 解决办法: 调试程序,仔细查看函数返回时各输出变量的值。更好的方法是:在条件判断或者执行循环之前对所使用的变量赋初值 ??? Error using ==mpower Matrix must be square 中文解释: 错误使用 mpwoer 函数,要求矩阵必须是方阵 错误原因: 在使用向量乘法运算的时候,没有用点乘。 解决办法: 在涉及向量乘法的语句中用 .* 代替 * ,更多的请参考本帖 5 楼的描述 Explicit integral could not be found. 中文解释: 显式解没有找到 出错原因: 并非每个函数的积分都有显式解,这是由于原函数没有解析结果而给出的警告 解决办法: 改用数值积分 (quad 、 quadl 等 ) 即可 Index exceeds matrix dimensions. Attempted to access b(3,2); index out of bounds because size(b)= . 中文解释 : 索引超出矩阵的范围 出错原因: 在引用矩阵元素的时候,索引值超出矩阵应有的范围 解决办法: 检查所定义数组的维数,和引用的范围。 举例: 【错误代码】: 1. b = zeros(2,2); 2. a = b(3,2); 复制代码 【正确代码】: 1. 2. b = zeros(2,2); 3. a = b(1,2); 复制代码 In an assignmentA(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 出错原因: I 和 B 的维数、大小不一样。这正如 “ 把 5 个水果放到 6 个篮子 ” 、或者 “ 把 6 个水果放到 5 个篮子 ” ,均无法实现 解决办法: 自己设置断点调试一下,看看 I 和 B 的维数、大小是否相同,不同的话就要修改成两者一致 举例: 【错误代码】: 1. b = ; 2. s(1) = b; 复制代码 【正确代码】: 1. 2. b = ; 3. for i = 1:2 4. s(i) = b(i); 5. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 To RESHAPE the number of elements must not change 中文解释: 矩阵 变换时,变换前和变换后的总元素不能改变 出错原因: 变换时语句使用不恰当 。例如, 变换前是 的 6 个元素的矩阵,变换后可以是 、 的 6 元素矩阵,但不能是 的 8 元素矩阵 解决办法: 自己设置断点调试一下,看看变换前后的矩阵大小是否相同,不同的话就要修改成两者一致 举例:(出错原因中已提及) 写给学习 matlab 的新手们 本人接触 matlab 已经有 5 年多的时间了,一直想写点东西,但是之前不知道放在哪里才能发挥它的最大作用,直到几天前碰上了这个论坛(有点像诸葛亮遇见姜维,哈哈)。 废话不说,我想借贵论坛宝地,写一些经验给使用 matlab 的新手们,当然了,老大们也可以看看,不嫌弃我写得粗糙的话还可以指点一下,先谢过了~~~~ 首先我想说的是, matlab 跟其他语言不一样(我用的比较多的编程语言,除了 matlab 就应该是 c 或 c ++了, VB 和 Delphi 也接触过,我想版面 (matlab 版 ) 大部分人也差不多),如果你抱着 “ 把其他语言的思想运用在 matlab 里面 ” 的话,那么我想,即使程序运行不出错,也很难把握 matlab 的精髓,也就很难发挥 matlab 的作用了。 所以,如果你是希望掌握一门语言、一个工具,使它更有效为你服务的话,那么,希望本文对你有所帮助,请精读;如果你是希望 matlab 作为 VC 的附属品,即你不想在 matlab 上面花太多功夫,只纯粹想用 matlab 来完成 VC 做不了或很难做成的任务的话,那么,本文你也应该至少浏览一下。 浏览 Matlab 是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此, for 循环(包括 while 循环)满天飞 ………….. 这不仅是暴殄天物(没有发挥 matlab 所长),还浪费了你宝贵的时间。对此,版友 MVH 在他的 “MATLAB 小技巧 ” 一文中也有所涉及,雷同的东西我也就不重复了, matlab 的 “ 帮助 ” 里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱 C ++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触 matlab 也有 2 、 3 年时间了(在此说明一下,接触 2 、 3 年并不是表示每天都会跟 matlab 打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题: J = 0; lt = size(imf1,2); for (i = 1:lt) if (abs(imf1(i)) 1) J = 1; break end end 上面的代码实现了一个目的 ―― 检查信号 imf1 (一个向量)是否存在绝对值大于 1 的点,这显然是基于 C ++的思想写出来的。如果在 matlab 下面,其实用两个语句就足够了(当然,可以合并为一个): q = find(imf11); J = ~isempty(q); 这样的修改带来的好处是很可观的。 又如: for j = 1:num imf1(start1+j) = 2*li1(j+1) - imf1(start1+j); end 这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示: imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num); 因此,如果是新手,可以先用循环(基于 C ++的思想)来编写代码,然后看看能否用 matlab 的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对 matlab 提供的一些函数比较熟悉才行,这些函数在 matlab 的 “ 帮助 ” 那里搜索 “Functions Used in Vectorizing” 就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的) 对提高 matlab 编程能力的方法,我想主要有以下三个: 1. 查 help 如何查?抽丝剥茧法,具体请看此贴 2 楼: matlab 画的三维图的怎么使x 轴的label 标注平行于x 轴 2. 多上上论坛,搜索帖子、发帖子提问 3. 阅读别人、特别是牛人的程序 当然了,正如所有的程序语言一样, “3 分课本 7 分上机 ” ,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。 以下技巧就是平日动手编程、阅读别人的帖子后整理出来的(不断添加中): · 1. matlab 的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上 “ 点 ” 。例如: a = a = 1 2 3 4 b = b = -1 -2 -3 0 a * b ans = -7 -2 -15 -6 a .* b ans = -1 -4 -9 0 也就是说, 没有加 “ 点 ” 的运算是对整个矩阵而言的,称为矩阵运算(整体运算),而加了 “ 点 ” 的运算是对每个元素而言的,称为点运算(局部运算) 。另外,一般情况下, matlab 作点运算(理解为左右两个对象(矩阵)的对应元素参与该运算)时,两个矩阵的维数和长度都要求是同大小的,且此时要在运算法前面添加 “ 点 ” ,但是在某些情况下该 “ 点 ” 可以省略,例如一个标量 a 和一个向量 b (或者矩阵)相加、相减、相乘、 b/a 时都可以不需要加点,表示 b 中每个元素都和 a 进行运算(即点运算的效果) · 2. 强烈建议大家在命名自己的函数名(更加准确应该说 m 文件名)时,在名称前面加上 my 等个人专用标识,即假如你要把你的函数命名为 conv ,则最好写成 myConv ,否则容易与 matlab 自带的函数( m 文件)名字重复而导致 “ Attempt to execute SCRIPT conv as a function ” 的错误!当你碰到这个错误时,可以在命令窗口中输入 which conv all 来看看到底有否重复命名了该函数,有的话,建议把自己命名的文件改名,保留 matlab 自带的文件。此外,命名文件名时,必须符合标识符的规范,即不能以数字开头等等,否则会出现莫名其妙的错误! · 3. 在条件判断中, y==0, a-b==0 这类语句应该尽量避免使用 ,除非你可以保证 y 、 a 、 b 在整个计算过程中是整数,否则两个浮点数相减、或者一个浮点数不可能完全等于 0 。因此,对浮点数进行条件判断时,最好采用 abs(a-b) = 1e-005 这种方式来进行等值比较 · 4. 循环变量递减时必须显式给出步长 ,即 i = 5:-1:-5 (假设步长为 -1 ),如果递增时且步长为 1 ,则可以省略,简写作 i = -5:5 · 5. 在引号环境下的语句中,如果需要使用单引号,则要写成两个单引号的形式,不能用一个双引号代替 !例如: ...'callback',' =wavread(''temp.wav'');' 文件名 temp.wav 外面的是两个单引号 · 6. 如果你编写的函数带有输入参数(例如 x ),则跟其他语言一样,这只是形式参数,所以不能通过直接运行该函数(或者 m 文件)来测试,这样会出现 ??? Input argument "x" is undefined . 的错误。一定要从其他地方(如命令窗口或者其他函数对其调用)来传递真实值,此时 x 才是实际参数。如果你有 C 语言的编程经验,命令窗口就相当于 main 函数;如果没有,以下是举例: myPlus.m : 此外,和每一种编程语言一样,所有定义的变量都有一定的作用域。虽然 matlab 宣称变量不需要定义即可以直接使用,但是,事实上任何编程语言的变量都需要先定义才能使用,所以 matlab 也不例外(看来真的是 “ matlab 宣称变量不需要定义 ” 惹的祸),只不过所不同的是并非使用 int x 这种方式来定义,而是使用一个简单的赋值语句包含定义 + 初始化。因此,如果直接使用未定义的变量(最常用的是在 “=” 右边首次出现),则会出现 “Undefined function or variable” 的错误!例如: 则运行时 matlab 会报错: Undefined function or variable t !此时当实际参数传递给输入变量 x 后, x 、 z 就被定义了,但是 t 却没有。 因此,强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误,具体做法参见以下图片: · 7. 如何调试程序 :编好程序(先保证代码没有语法错误),设置断点( m 文件编辑窗口中菜单 Debug 有 Set/Clear breakpoint ),运行程序(菜单 Debug 有 Run 或 Save Run ),此时 matlab 会停在断点处,各变量的值可以通过鼠标停留在变量名上观察到,或者在命令窗口中敲入变量名后得到 · 8. 对于 matlab 自带函数(命令)的问题,请多利用 matlab 的帮助功能。即在命令窗口中输入: help eval 或者 doc eval 。更多的帮助指令请参阅以下链接的帖子: MATLAB 中的帮助指令 · 9. 对于 mat 文件的读取,由于存放的是结构体数组,因此调用 A = load('*.mat') 后,得到的 A 并非原始数据,而是一个结构体 ,此时需要使用 ". 域名 " 才能正确得到数据,例如: 后得到: A = Signal: TargetChar: Flashing: StimulusCode: StimulusType: 则用: · 此外, 不建议使用 load *; 这种方式读取 mat 文件 (读取 dat 等其他格式的文件也是类似),因为此时读取后的变量名是存储时设定的,假若文件并非您本人存储,则无法获悉这个变量名,通过这种方式是无法在读取时候指定数据存放在哪个变量中的,这样将会导致下文不知道使用哪个变量名,甚至会导致出错!因此,强烈建议采用 A = load('*.mat'); 方式进行读取,当然了,如果文件是您本人存储的,则用前面的方式比较简便,这另当别论。下面以 dat 文件作为例子说明: clear all a = magic(4);b = ones(2, 4) * -5.7;c = ; save -ascii 1_data.dat load 1_data.dat 因为这种方式的读取是把数据默认存放在以 “ 不含后缀的文件名 ” 命名的变量中(这里为 1_data ),但是由于 1_data 不是合法的标识符,因此 matlab 自动改成 X1_data (不同版本的 matlab 可能不同),即读取出来的数据事实上是存放在 X1_data 变量中。如果使用 m 文件方式编程(即 load 1_data.dat 后有分号),则这个变量名根本不会显示出来,也就是说,对它的改名你是毫不知情的,这时候下文继续使用 1_data 的话,就会产生错误 。 · 10. matlab 对中文的文件路径(不光是文件名)不太支持,特别是 6.5 版本。 · 11. 函数不能在命令窗口中定义,只能在 m 文件中定义。否则出现: ??? Error: Function definitions are not permitted at the prompt or in scripts . 的错误! 最后,整理一下常用的快捷键(用【】表示)或命令: 1. 在命令窗口 (Command Window) 中: 1) 【上、下键】 ―― 切换到之前、之后的命令,可以重复按多次来达到你想要的命令 2) clc―― 清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉 3) clear―― 这个才是清空当前工作区的变量命令,常用语句 clear all 来完成 4) 【 Tab 】键 ―― (转自版友心灯)在 matlab@hit.edu.cn 看到的:在 command 窗口,输入一个命令的前几个字符,然后按 tab 键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是: matlab6.5 版本中,如果候选命令超过 100 个,则不显示。而在 matlab7 以后版本中,则没有这个限制,均可正常提示 5) 【 Ctrl+C 】(或【 Ctrl + Break 】) ―― (转自版友 yangjin_ren )在 matlab 程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入 “Ctrl+C” 可以将运行的程序停下来,而不需要将整个 Matlab 程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。 2. 在编辑器 (Editor) 中: 1) 【 Tab 】(或【 Ctrl+] 】) ―― 增加缩进(对多行有效) 2) 【 Ctrl+ . 中文解释: 索引超出矩阵的范围 附本人遇到的问题: Attempted to access x(3); index out of bounds because numel(x)=2. 表示 x 矩阵元素不够,导致 x(3) 无法索引。 11.In an assignment A(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 12.To RESHAPE the number of elements must not change 中文解释: 矩阵变换时,变换前和变换后的总元素不能改变
289 次阅读|0 个评论
分享 MATLAB常见错误汇总
ML2 2013-8-18 15:51
Matlab 常见语法错误 Subscript indices must either be real positive integers or logicals 中文解释: 下标索引必须是正整数类型或者逻辑类型 出错原因: 在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注: matlab 的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。 解决办法: 自己调试一下程序,把下标为 0 或者负数的地方修正。关于矩阵的各种访问方式。 举例: 【错误代码】: 1. for s = 0:0.2:2 2. a(s) = 4 * s - 1; 3. end 复制代码 【正确代码】: 1. 2. for s = 1:10 3. a(s) = 4 * s - 1; 4. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 Undefined function or variable "a" 中文解释: 函数或变量 a 没有定义 出错原因及解决办法: 1. 如果 a 是变量,则 参见 写给学习 matlab 的新手们 一贴中技巧 6 后半部分 2. 如果 a 是函数,则这是因为 matlab 在所有已添加的路径中都无法找到该函数对应的 m 文件而导致的,对此,把该 m 文件移动到当前路径下再运行便可。(注:何谓 “ 所有已添加的路径 ”—— 在命令窗口中输入 pathtool 可以查看;何谓 “ 当前路径 ”—— 在命令窗口中输入 pwd 可以查看) 举例: myPlus.m : 1. function d = myPlus(a,b) 2. d = a + b; 复制代码 【错误调用】: 命令窗口: 1. z = myPlus(a,b) 复制代码 【正确调用】: 命令窗口: 1. x = 2; 2. y = 5; 3. z = myPlus(x,y) 复制代码 Input argument "x" is undefined 中文解释: 输入变量 x 没有定义 出错原因及解决方法: 参见 写给学习 matlab 的新手们 一贴中技巧 6 举例: 1. function y = myTest(x) 2. y = x * 2; 复制代码 【错误调用】: 直接在 m 文件编辑窗口运行程序,或者命令窗口: 1. a = myTest; 复制代码 【正确调用】: 1. b = 4; 2. a = myText(b); 复制代码 Matrix dimensions must agree Inner matrix dimensions must agree 中文解释: 矩阵的维数必须一致 出错原因: 这是由于运算符 (= + - / * 等 ) 两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。 matlab 通过 “.” 来区分矩阵运算和元素运算,对此可以参阅: 写给学习 matlab 的新手们 一贴中技巧 1 解决办法: 自己调试一下程序,保证运算符两边的运算对象维数一致 举例: 【错误代码】: 1. b = ; 2. a = ; 3. c = a*b; 复制代码 【正确代码】: 1. 2. b = ; 3. a = ; 4. c = a.*b; 复制代码 Attempt to execute SCRIPT conv as a function 出错原因及解决办法: 参见 写给学习 matlab 的新手们 一贴中技巧 2 如果经过上述检测后仍然出现错误,则请把 m 文件的路径设置为常规的试试,即不使用中文的路径、不使用数字作为 m 文件名的开头等等 Function definitions are not permitted at the prompt or in scripts 中文解释: 不能在命令窗口或者脚本文件中定义函数 出错原因: 一旦在命令窗口写 function c = myPlus(a,b) ,此错误就会出现,因为函数只能定义在 m 文件中。关于脚本文件和 m 文件的区别请查阅 matlab 基础书。简言之: 1) 如果你写成 function 的形式,那么必须写在 m 文件中,且以 function 开头(即 function 语句前不能包含其他语句,所有语句必须放在 function 中,当然, function 的定义可以有多个,各 function 之间是并列关系,不能嵌套); 2) 如果你写成脚本的形式,则既可以写在命令窗口中,也可以写在 m 文件中,但两者均不能包含 function 语句(即不能进行函数的定义) 解决办法: 新建一个 m 文件,然后再进行函数的定义 1. X must have one or two columns 2. Vectors must be the same lengths 中文解释: 1.X 必须是 1 或者 2 列 2. 向量长度必须一致 出错原因: 1. 实际输入不满足该条件。至于如何判断矩阵的行、列,请参阅高等代数或者 matlab 的基础书籍 2. 输入的两个(或几个)变量长度不满足该条件。例如 plot 函数的前两个输入变量,如果一个是 1*2 ,另一个是 1*3 ,则会出错 解决方法: 都需要自己调试一下 1. 把 X 的维数改为 1 或者 2 列 2. 按照函数的语法要求把向量的长度设置为一样 举例: 【错误代码】: 1. a = ; 2. b = ; 3. plot(a,b); 复制代码 【正确代码】: 1. 2. a = ; 3. b = ; 4. plot(a,b); 复制代码 One or more output arguments not assigned during call to '...' 中文解释: 在调用 ... 函数过程中,一个或多个输出变量没有被赋值 出错原因: 函数如果带有输出变量,则每个输出在返回的时候都必须被赋值。容易出现这个错误的两个地方是: 1) 在部分条件判断语句(如 if )中没有考虑到输出变量的返回值。例子: 多输入多输出报错 2) 在循环迭代过程中部分变量的维数发生了变化。例子: 请几位版主看看这个程序什么错误 解决办法: 调试程序,仔细查看函数返回时各输出变量的值。更好的方法是:在条件判断或者执行循环之前对所使用的变量赋初值 ??? Error using ==mpower Matrix must be square 中文解释: 错误使用 mpwoer 函数,要求矩阵必须是方阵 错误原因: 在使用向量乘法运算的时候,没有用点乘。 解决办法: 在涉及向量乘法的语句中用 .* 代替 * ,更多的请参考本帖 5 楼的描述 Explicit integral could not be found. 中文解释: 显式解没有找到 出错原因: 并非每个函数的积分都有显式解,这是由于原函数没有解析结果而给出的警告 解决办法: 改用数值积分 (quad 、 quadl 等 ) 即可 Index exceeds matrix dimensions. Attempted to access b(3,2); index out of bounds because size(b)= . 中文解释 : 索引超出矩阵的范围 出错原因: 在引用矩阵元素的时候,索引值超出矩阵应有的范围 解决办法: 检查所定义数组的维数,和引用的范围。 举例: 【错误代码】: 1. b = zeros(2,2); 2. a = b(3,2); 复制代码 【正确代码】: 1. 2. b = zeros(2,2); 3. a = b(1,2); 复制代码 In an assignmentA(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 出错原因: I 和 B 的维数、大小不一样。这正如 “ 把 5 个水果放到 6 个篮子 ” 、或者 “ 把 6 个水果放到 5 个篮子 ” ,均无法实现 解决办法: 自己设置断点调试一下,看看 I 和 B 的维数、大小是否相同,不同的话就要修改成两者一致 举例: 【错误代码】: 1. b = ; 2. s(1) = b; 复制代码 【正确代码】: 1. 2. b = ; 3. for i = 1:2 4. s(i) = b(i); 5. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 To RESHAPE the number of elements must not change 中文解释: 矩阵 变换时,变换前和变换后的总元素不能改变 出错原因: 变换时语句使用不恰当 。例如, 变换前是 的 6 个元素的矩阵,变换后可以是 、 的 6 元素矩阵,但不能是 的 8 元素矩阵 解决办法: 自己设置断点调试一下,看看变换前后的矩阵大小是否相同,不同的话就要修改成两者一致 举例:(出错原因中已提及) 写给学习 matlab 的新手们 本人接触 matlab 已经有 5 年多的时间了,一直想写点东西,但是之前不知道放在哪里才能发挥它的最大作用,直到几天前碰上了这个论坛(有点像诸葛亮遇见姜维,哈哈)。 废话不说,我想借贵论坛宝地,写一些经验给使用 matlab 的新手们,当然了,老大们也可以看看,不嫌弃我写得粗糙的话还可以指点一下,先谢过了~~~~ 首先我想说的是, matlab 跟其他语言不一样(我用的比较多的编程语言,除了 matlab 就应该是 c 或 c ++了, VB 和 Delphi 也接触过,我想版面 (matlab 版 ) 大部分人也差不多),如果你抱着 “ 把其他语言的思想运用在 matlab 里面 ” 的话,那么我想,即使程序运行不出错,也很难把握 matlab 的精髓,也就很难发挥 matlab 的作用了。 所以,如果你是希望掌握一门语言、一个工具,使它更有效为你服务的话,那么,希望本文对你有所帮助,请精读;如果你是希望 matlab 作为 VC 的附属品,即你不想在 matlab 上面花太多功夫,只纯粹想用 matlab 来完成 VC 做不了或很难做成的任务的话,那么,本文你也应该至少浏览一下。 浏览 Matlab 是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此, for 循环(包括 while 循环)满天飞 ………….. 这不仅是暴殄天物(没有发挥 matlab 所长),还浪费了你宝贵的时间。对此,版友 MVH 在他的 “MATLAB 小技巧 ” 一文中也有所涉及,雷同的东西我也就不重复了, matlab 的 “ 帮助 ” 里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱 C ++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触 matlab 也有 2 、 3 年时间了(在此说明一下,接触 2 、 3 年并不是表示每天都会跟 matlab 打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题: J = 0; lt = size(imf1,2); for (i = 1:lt) if (abs(imf1(i)) 1) J = 1; break end end 上面的代码实现了一个目的 ―― 检查信号 imf1 (一个向量)是否存在绝对值大于 1 的点,这显然是基于 C ++的思想写出来的。如果在 matlab 下面,其实用两个语句就足够了(当然,可以合并为一个): q = find(imf11); J = ~isempty(q); 这样的修改带来的好处是很可观的。 又如: for j = 1:num imf1(start1+j) = 2*li1(j+1) - imf1(start1+j); end 这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示: imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num); 因此,如果是新手,可以先用循环(基于 C ++的思想)来编写代码,然后看看能否用 matlab 的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对 matlab 提供的一些函数比较熟悉才行,这些函数在 matlab 的 “ 帮助 ” 那里搜索 “Functions Used in Vectorizing” 就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的) 对提高 matlab 编程能力的方法,我想主要有以下三个: 1. 查 help 如何查?抽丝剥茧法,具体请看此贴 2 楼: matlab 画的三维图的怎么使x 轴的label 标注平行于x 轴 2. 多上上论坛,搜索帖子、发帖子提问 3. 阅读别人、特别是牛人的程序 当然了,正如所有的程序语言一样, “3 分课本 7 分上机 ” ,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。 以下技巧就是平日动手编程、阅读别人的帖子后整理出来的(不断添加中): · 1. matlab 的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上 “ 点 ” 。例如: a = a = 1 2 3 4 b = b = -1 -2 -3 0 a * b ans = -7 -2 -15 -6 a .* b ans = -1 -4 -9 0 也就是说, 没有加 “ 点 ” 的运算是对整个矩阵而言的,称为矩阵运算(整体运算),而加了 “ 点 ” 的运算是对每个元素而言的,称为点运算(局部运算) 。另外,一般情况下, matlab 作点运算(理解为左右两个对象(矩阵)的对应元素参与该运算)时,两个矩阵的维数和长度都要求是同大小的,且此时要在运算法前面添加 “ 点 ” ,但是在某些情况下该 “ 点 ” 可以省略,例如一个标量 a 和一个向量 b (或者矩阵)相加、相减、相乘、 b/a 时都可以不需要加点,表示 b 中每个元素都和 a 进行运算(即点运算的效果) · 2. 强烈建议大家在命名自己的函数名(更加准确应该说 m 文件名)时,在名称前面加上 my 等个人专用标识,即假如你要把你的函数命名为 conv ,则最好写成 myConv ,否则容易与 matlab 自带的函数( m 文件)名字重复而导致 “ Attempt to execute SCRIPT conv as a function ” 的错误!当你碰到这个错误时,可以在命令窗口中输入 which conv all 来看看到底有否重复命名了该函数,有的话,建议把自己命名的文件改名,保留 matlab 自带的文件。此外,命名文件名时,必须符合标识符的规范,即不能以数字开头等等,否则会出现莫名其妙的错误! · 3. 在条件判断中, y==0, a-b==0 这类语句应该尽量避免使用 ,除非你可以保证 y 、 a 、 b 在整个计算过程中是整数,否则两个浮点数相减、或者一个浮点数不可能完全等于 0 。因此,对浮点数进行条件判断时,最好采用 abs(a-b) = 1e-005 这种方式来进行等值比较 · 4. 循环变量递减时必须显式给出步长 ,即 i = 5:-1:-5 (假设步长为 -1 ),如果递增时且步长为 1 ,则可以省略,简写作 i = -5:5 · 5. 在引号环境下的语句中,如果需要使用单引号,则要写成两个单引号的形式,不能用一个双引号代替 !例如: ...'callback',' =wavread(''temp.wav'');' 文件名 temp.wav 外面的是两个单引号 · 6. 如果你编写的函数带有输入参数(例如 x ),则跟其他语言一样,这只是形式参数,所以不能通过直接运行该函数(或者 m 文件)来测试,这样会出现 ??? Input argument "x" is undefined . 的错误。一定要从其他地方(如命令窗口或者其他函数对其调用)来传递真实值,此时 x 才是实际参数。如果你有 C 语言的编程经验,命令窗口就相当于 main 函数;如果没有,以下是举例: myPlus.m : 此外,和每一种编程语言一样,所有定义的变量都有一定的作用域。虽然 matlab 宣称变量不需要定义即可以直接使用,但是,事实上任何编程语言的变量都需要先定义才能使用,所以 matlab 也不例外(看来真的是 “ matlab 宣称变量不需要定义 ” 惹的祸),只不过所不同的是并非使用 int x 这种方式来定义,而是使用一个简单的赋值语句包含定义 + 初始化。因此,如果直接使用未定义的变量(最常用的是在 “=” 右边首次出现),则会出现 “Undefined function or variable” 的错误!例如: 则运行时 matlab 会报错: Undefined function or variable t !此时当实际参数传递给输入变量 x 后, x 、 z 就被定义了,但是 t 却没有。 因此,强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误,具体做法参见以下图片: · 7. 如何调试程序 :编好程序(先保证代码没有语法错误),设置断点( m 文件编辑窗口中菜单 Debug 有 Set/Clear breakpoint ),运行程序(菜单 Debug 有 Run 或 Save Run ),此时 matlab 会停在断点处,各变量的值可以通过鼠标停留在变量名上观察到,或者在命令窗口中敲入变量名后得到 · 8. 对于 matlab 自带函数(命令)的问题,请多利用 matlab 的帮助功能。即在命令窗口中输入: help eval 或者 doc eval 。更多的帮助指令请参阅以下链接的帖子: MATLAB 中的帮助指令 · 9. 对于 mat 文件的读取,由于存放的是结构体数组,因此调用 A = load('*.mat') 后,得到的 A 并非原始数据,而是一个结构体 ,此时需要使用 ". 域名 " 才能正确得到数据,例如: 后得到: A = Signal: TargetChar: Flashing: StimulusCode: StimulusType: 则用: · 此外, 不建议使用 load *; 这种方式读取 mat 文件 (读取 dat 等其他格式的文件也是类似),因为此时读取后的变量名是存储时设定的,假若文件并非您本人存储,则无法获悉这个变量名,通过这种方式是无法在读取时候指定数据存放在哪个变量中的,这样将会导致下文不知道使用哪个变量名,甚至会导致出错!因此,强烈建议采用 A = load('*.mat'); 方式进行读取,当然了,如果文件是您本人存储的,则用前面的方式比较简便,这另当别论。下面以 dat 文件作为例子说明: clear all a = magic(4);b = ones(2, 4) * -5.7;c = ; save -ascii 1_data.dat load 1_data.dat 因为这种方式的读取是把数据默认存放在以 “ 不含后缀的文件名 ” 命名的变量中(这里为 1_data ),但是由于 1_data 不是合法的标识符,因此 matlab 自动改成 X1_data (不同版本的 matlab 可能不同),即读取出来的数据事实上是存放在 X1_data 变量中。如果使用 m 文件方式编程(即 load 1_data.dat 后有分号),则这个变量名根本不会显示出来,也就是说,对它的改名你是毫不知情的,这时候下文继续使用 1_data 的话,就会产生错误 。 · 10. matlab 对中文的文件路径(不光是文件名)不太支持,特别是 6.5 版本。 · 11. 函数不能在命令窗口中定义,只能在 m 文件中定义。否则出现: ??? Error: Function definitions are not permitted at the prompt or in scripts . 的错误! 最后,整理一下常用的快捷键(用【】表示)或命令: 1. 在命令窗口 (Command Window) 中: 1) 【上、下键】 ―― 切换到之前、之后的命令,可以重复按多次来达到你想要的命令 2) clc―― 清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉 3) clear―― 这个才是清空当前工作区的变量命令,常用语句 clear all 来完成 4) 【 Tab 】键 ―― (转自版友心灯)在 matlab@hit.edu.cn 看到的:在 command 窗口,输入一个命令的前几个字符,然后按 tab 键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是: matlab6.5 版本中,如果候选命令超过 100 个,则不显示。而在 matlab7 以后版本中,则没有这个限制,均可正常提示 5) 【 Ctrl+C 】(或【 Ctrl + Break 】) ―― (转自版友 yangjin_ren )在 matlab 程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入 “Ctrl+C” 可以将运行的程序停下来,而不需要将整个 Matlab 程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。 2. 在编辑器 (Editor) 中: 1) 【 Tab 】(或【 Ctrl+] 】) ―― 增加缩进(对多行有效) 2) 【 Ctrl+ . 中文解释: 索引超出矩阵的范围 附本人遇到的问题: Attempted to access x(3); index out of bounds because numel(x)=2. 表示 x 矩阵元素不够,导致 x(3) 无法索引。 11.In an assignment A(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 12.To RESHAPE the number of elements must not change 中文解释: 矩阵变换时,变换前和变换后的总元素不能改变
363 次阅读|0 个评论
分享 MATLAB常见错误汇总
ML2 2013-8-18 15:51
Matlab 常见语法错误 Subscript indices must either be real positive integers or logicals 中文解释: 下标索引必须是正整数类型或者逻辑类型 出错原因: 在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注: matlab 的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。 解决办法: 自己调试一下程序,把下标为 0 或者负数的地方修正。关于矩阵的各种访问方式。 举例: 【错误代码】: 1. for s = 0:0.2:2 2. a(s) = 4 * s - 1; 3. end 复制代码 【正确代码】: 1. 2. for s = 1:10 3. a(s) = 4 * s - 1; 4. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 Undefined function or variable "a" 中文解释: 函数或变量 a 没有定义 出错原因及解决办法: 1. 如果 a 是变量,则 参见 写给学习 matlab 的新手们 一贴中技巧 6 后半部分 2. 如果 a 是函数,则这是因为 matlab 在所有已添加的路径中都无法找到该函数对应的 m 文件而导致的,对此,把该 m 文件移动到当前路径下再运行便可。(注:何谓 “ 所有已添加的路径 ”—— 在命令窗口中输入 pathtool 可以查看;何谓 “ 当前路径 ”—— 在命令窗口中输入 pwd 可以查看) 举例: myPlus.m : 1. function d = myPlus(a,b) 2. d = a + b; 复制代码 【错误调用】: 命令窗口: 1. z = myPlus(a,b) 复制代码 【正确调用】: 命令窗口: 1. x = 2; 2. y = 5; 3. z = myPlus(x,y) 复制代码 Input argument "x" is undefined 中文解释: 输入变量 x 没有定义 出错原因及解决方法: 参见 写给学习 matlab 的新手们 一贴中技巧 6 举例: 1. function y = myTest(x) 2. y = x * 2; 复制代码 【错误调用】: 直接在 m 文件编辑窗口运行程序,或者命令窗口: 1. a = myTest; 复制代码 【正确调用】: 1. b = 4; 2. a = myText(b); 复制代码 Matrix dimensions must agree Inner matrix dimensions must agree 中文解释: 矩阵的维数必须一致 出错原因: 这是由于运算符 (= + - / * 等 ) 两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。 matlab 通过 “.” 来区分矩阵运算和元素运算,对此可以参阅: 写给学习 matlab 的新手们 一贴中技巧 1 解决办法: 自己调试一下程序,保证运算符两边的运算对象维数一致 举例: 【错误代码】: 1. b = ; 2. a = ; 3. c = a*b; 复制代码 【正确代码】: 1. 2. b = ; 3. a = ; 4. c = a.*b; 复制代码 Attempt to execute SCRIPT conv as a function 出错原因及解决办法: 参见 写给学习 matlab 的新手们 一贴中技巧 2 如果经过上述检测后仍然出现错误,则请把 m 文件的路径设置为常规的试试,即不使用中文的路径、不使用数字作为 m 文件名的开头等等 Function definitions are not permitted at the prompt or in scripts 中文解释: 不能在命令窗口或者脚本文件中定义函数 出错原因: 一旦在命令窗口写 function c = myPlus(a,b) ,此错误就会出现,因为函数只能定义在 m 文件中。关于脚本文件和 m 文件的区别请查阅 matlab 基础书。简言之: 1) 如果你写成 function 的形式,那么必须写在 m 文件中,且以 function 开头(即 function 语句前不能包含其他语句,所有语句必须放在 function 中,当然, function 的定义可以有多个,各 function 之间是并列关系,不能嵌套); 2) 如果你写成脚本的形式,则既可以写在命令窗口中,也可以写在 m 文件中,但两者均不能包含 function 语句(即不能进行函数的定义) 解决办法: 新建一个 m 文件,然后再进行函数的定义 1. X must have one or two columns 2. Vectors must be the same lengths 中文解释: 1.X 必须是 1 或者 2 列 2. 向量长度必须一致 出错原因: 1. 实际输入不满足该条件。至于如何判断矩阵的行、列,请参阅高等代数或者 matlab 的基础书籍 2. 输入的两个(或几个)变量长度不满足该条件。例如 plot 函数的前两个输入变量,如果一个是 1*2 ,另一个是 1*3 ,则会出错 解决方法: 都需要自己调试一下 1. 把 X 的维数改为 1 或者 2 列 2. 按照函数的语法要求把向量的长度设置为一样 举例: 【错误代码】: 1. a = ; 2. b = ; 3. plot(a,b); 复制代码 【正确代码】: 1. 2. a = ; 3. b = ; 4. plot(a,b); 复制代码 One or more output arguments not assigned during call to '...' 中文解释: 在调用 ... 函数过程中,一个或多个输出变量没有被赋值 出错原因: 函数如果带有输出变量,则每个输出在返回的时候都必须被赋值。容易出现这个错误的两个地方是: 1) 在部分条件判断语句(如 if )中没有考虑到输出变量的返回值。例子: 多输入多输出报错 2) 在循环迭代过程中部分变量的维数发生了变化。例子: 请几位版主看看这个程序什么错误 解决办法: 调试程序,仔细查看函数返回时各输出变量的值。更好的方法是:在条件判断或者执行循环之前对所使用的变量赋初值 ??? Error using ==mpower Matrix must be square 中文解释: 错误使用 mpwoer 函数,要求矩阵必须是方阵 错误原因: 在使用向量乘法运算的时候,没有用点乘。 解决办法: 在涉及向量乘法的语句中用 .* 代替 * ,更多的请参考本帖 5 楼的描述 Explicit integral could not be found. 中文解释: 显式解没有找到 出错原因: 并非每个函数的积分都有显式解,这是由于原函数没有解析结果而给出的警告 解决办法: 改用数值积分 (quad 、 quadl 等 ) 即可 Index exceeds matrix dimensions. Attempted to access b(3,2); index out of bounds because size(b)= . 中文解释 : 索引超出矩阵的范围 出错原因: 在引用矩阵元素的时候,索引值超出矩阵应有的范围 解决办法: 检查所定义数组的维数,和引用的范围。 举例: 【错误代码】: 1. b = zeros(2,2); 2. a = b(3,2); 复制代码 【正确代码】: 1. 2. b = zeros(2,2); 3. a = b(1,2); 复制代码 In an assignmentA(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 出错原因: I 和 B 的维数、大小不一样。这正如 “ 把 5 个水果放到 6 个篮子 ” 、或者 “ 把 6 个水果放到 5 个篮子 ” ,均无法实现 解决办法: 自己设置断点调试一下,看看 I 和 B 的维数、大小是否相同,不同的话就要修改成两者一致 举例: 【错误代码】: 1. b = ; 2. s(1) = b; 复制代码 【正确代码】: 1. 2. b = ; 3. for i = 1:2 4. s(i) = b(i); 5. end 复制代码 当然,这样的赋值使用循环是低效的,因此不提倡 To RESHAPE the number of elements must not change 中文解释: 矩阵 变换时,变换前和变换后的总元素不能改变 出错原因: 变换时语句使用不恰当 。例如, 变换前是 的 6 个元素的矩阵,变换后可以是 、 的 6 元素矩阵,但不能是 的 8 元素矩阵 解决办法: 自己设置断点调试一下,看看变换前后的矩阵大小是否相同,不同的话就要修改成两者一致 举例:(出错原因中已提及) 写给学习 matlab 的新手们 本人接触 matlab 已经有 5 年多的时间了,一直想写点东西,但是之前不知道放在哪里才能发挥它的最大作用,直到几天前碰上了这个论坛(有点像诸葛亮遇见姜维,哈哈)。 废话不说,我想借贵论坛宝地,写一些经验给使用 matlab 的新手们,当然了,老大们也可以看看,不嫌弃我写得粗糙的话还可以指点一下,先谢过了~~~~ 首先我想说的是, matlab 跟其他语言不一样(我用的比较多的编程语言,除了 matlab 就应该是 c 或 c ++了, VB 和 Delphi 也接触过,我想版面 (matlab 版 ) 大部分人也差不多),如果你抱着 “ 把其他语言的思想运用在 matlab 里面 ” 的话,那么我想,即使程序运行不出错,也很难把握 matlab 的精髓,也就很难发挥 matlab 的作用了。 所以,如果你是希望掌握一门语言、一个工具,使它更有效为你服务的话,那么,希望本文对你有所帮助,请精读;如果你是希望 matlab 作为 VC 的附属品,即你不想在 matlab 上面花太多功夫,只纯粹想用 matlab 来完成 VC 做不了或很难做成的任务的话,那么,本文你也应该至少浏览一下。 浏览 Matlab 是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此, for 循环(包括 while 循环)满天飞 ………….. 这不仅是暴殄天物(没有发挥 matlab 所长),还浪费了你宝贵的时间。对此,版友 MVH 在他的 “MATLAB 小技巧 ” 一文中也有所涉及,雷同的东西我也就不重复了, matlab 的 “ 帮助 ” 里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱 C ++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触 matlab 也有 2 、 3 年时间了(在此说明一下,接触 2 、 3 年并不是表示每天都会跟 matlab 打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题: J = 0; lt = size(imf1,2); for (i = 1:lt) if (abs(imf1(i)) 1) J = 1; break end end 上面的代码实现了一个目的 ―― 检查信号 imf1 (一个向量)是否存在绝对值大于 1 的点,这显然是基于 C ++的思想写出来的。如果在 matlab 下面,其实用两个语句就足够了(当然,可以合并为一个): q = find(imf11); J = ~isempty(q); 这样的修改带来的好处是很可观的。 又如: for j = 1:num imf1(start1+j) = 2*li1(j+1) - imf1(start1+j); end 这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示: imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num); 因此,如果是新手,可以先用循环(基于 C ++的思想)来编写代码,然后看看能否用 matlab 的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对 matlab 提供的一些函数比较熟悉才行,这些函数在 matlab 的 “ 帮助 ” 那里搜索 “Functions Used in Vectorizing” 就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的) 对提高 matlab 编程能力的方法,我想主要有以下三个: 1. 查 help 如何查?抽丝剥茧法,具体请看此贴 2 楼: matlab 画的三维图的怎么使x 轴的label 标注平行于x 轴 2. 多上上论坛,搜索帖子、发帖子提问 3. 阅读别人、特别是牛人的程序 当然了,正如所有的程序语言一样, “3 分课本 7 分上机 ” ,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。 以下技巧就是平日动手编程、阅读别人的帖子后整理出来的(不断添加中): · 1. matlab 的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上 “ 点 ” 。例如: a = a = 1 2 3 4 b = b = -1 -2 -3 0 a * b ans = -7 -2 -15 -6 a .* b ans = -1 -4 -9 0 也就是说, 没有加 “ 点 ” 的运算是对整个矩阵而言的,称为矩阵运算(整体运算),而加了 “ 点 ” 的运算是对每个元素而言的,称为点运算(局部运算) 。另外,一般情况下, matlab 作点运算(理解为左右两个对象(矩阵)的对应元素参与该运算)时,两个矩阵的维数和长度都要求是同大小的,且此时要在运算法前面添加 “ 点 ” ,但是在某些情况下该 “ 点 ” 可以省略,例如一个标量 a 和一个向量 b (或者矩阵)相加、相减、相乘、 b/a 时都可以不需要加点,表示 b 中每个元素都和 a 进行运算(即点运算的效果) · 2. 强烈建议大家在命名自己的函数名(更加准确应该说 m 文件名)时,在名称前面加上 my 等个人专用标识,即假如你要把你的函数命名为 conv ,则最好写成 myConv ,否则容易与 matlab 自带的函数( m 文件)名字重复而导致 “ Attempt to execute SCRIPT conv as a function ” 的错误!当你碰到这个错误时,可以在命令窗口中输入 which conv all 来看看到底有否重复命名了该函数,有的话,建议把自己命名的文件改名,保留 matlab 自带的文件。此外,命名文件名时,必须符合标识符的规范,即不能以数字开头等等,否则会出现莫名其妙的错误! · 3. 在条件判断中, y==0, a-b==0 这类语句应该尽量避免使用 ,除非你可以保证 y 、 a 、 b 在整个计算过程中是整数,否则两个浮点数相减、或者一个浮点数不可能完全等于 0 。因此,对浮点数进行条件判断时,最好采用 abs(a-b) = 1e-005 这种方式来进行等值比较 · 4. 循环变量递减时必须显式给出步长 ,即 i = 5:-1:-5 (假设步长为 -1 ),如果递增时且步长为 1 ,则可以省略,简写作 i = -5:5 · 5. 在引号环境下的语句中,如果需要使用单引号,则要写成两个单引号的形式,不能用一个双引号代替 !例如: ...'callback',' =wavread(''temp.wav'');' 文件名 temp.wav 外面的是两个单引号 · 6. 如果你编写的函数带有输入参数(例如 x ),则跟其他语言一样,这只是形式参数,所以不能通过直接运行该函数(或者 m 文件)来测试,这样会出现 ??? Input argument "x" is undefined . 的错误。一定要从其他地方(如命令窗口或者其他函数对其调用)来传递真实值,此时 x 才是实际参数。如果你有 C 语言的编程经验,命令窗口就相当于 main 函数;如果没有,以下是举例: myPlus.m : 此外,和每一种编程语言一样,所有定义的变量都有一定的作用域。虽然 matlab 宣称变量不需要定义即可以直接使用,但是,事实上任何编程语言的变量都需要先定义才能使用,所以 matlab 也不例外(看来真的是 “ matlab 宣称变量不需要定义 ” 惹的祸),只不过所不同的是并非使用 int x 这种方式来定义,而是使用一个简单的赋值语句包含定义 + 初始化。因此,如果直接使用未定义的变量(最常用的是在 “=” 右边首次出现),则会出现 “Undefined function or variable” 的错误!例如: 则运行时 matlab 会报错: Undefined function or variable t !此时当实际参数传递给输入变量 x 后, x 、 z 就被定义了,但是 t 却没有。 因此,强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误,具体做法参见以下图片: · 7. 如何调试程序 :编好程序(先保证代码没有语法错误),设置断点( m 文件编辑窗口中菜单 Debug 有 Set/Clear breakpoint ),运行程序(菜单 Debug 有 Run 或 Save Run ),此时 matlab 会停在断点处,各变量的值可以通过鼠标停留在变量名上观察到,或者在命令窗口中敲入变量名后得到 · 8. 对于 matlab 自带函数(命令)的问题,请多利用 matlab 的帮助功能。即在命令窗口中输入: help eval 或者 doc eval 。更多的帮助指令请参阅以下链接的帖子: MATLAB 中的帮助指令 · 9. 对于 mat 文件的读取,由于存放的是结构体数组,因此调用 A = load('*.mat') 后,得到的 A 并非原始数据,而是一个结构体 ,此时需要使用 ". 域名 " 才能正确得到数据,例如: 后得到: A = Signal: TargetChar: Flashing: StimulusCode: StimulusType: 则用: · 此外, 不建议使用 load *; 这种方式读取 mat 文件 (读取 dat 等其他格式的文件也是类似),因为此时读取后的变量名是存储时设定的,假若文件并非您本人存储,则无法获悉这个变量名,通过这种方式是无法在读取时候指定数据存放在哪个变量中的,这样将会导致下文不知道使用哪个变量名,甚至会导致出错!因此,强烈建议采用 A = load('*.mat'); 方式进行读取,当然了,如果文件是您本人存储的,则用前面的方式比较简便,这另当别论。下面以 dat 文件作为例子说明: clear all a = magic(4);b = ones(2, 4) * -5.7;c = ; save -ascii 1_data.dat load 1_data.dat 因为这种方式的读取是把数据默认存放在以 “ 不含后缀的文件名 ” 命名的变量中(这里为 1_data ),但是由于 1_data 不是合法的标识符,因此 matlab 自动改成 X1_data (不同版本的 matlab 可能不同),即读取出来的数据事实上是存放在 X1_data 变量中。如果使用 m 文件方式编程(即 load 1_data.dat 后有分号),则这个变量名根本不会显示出来,也就是说,对它的改名你是毫不知情的,这时候下文继续使用 1_data 的话,就会产生错误 。 · 10. matlab 对中文的文件路径(不光是文件名)不太支持,特别是 6.5 版本。 · 11. 函数不能在命令窗口中定义,只能在 m 文件中定义。否则出现: ??? Error: Function definitions are not permitted at the prompt or in scripts . 的错误! 最后,整理一下常用的快捷键(用【】表示)或命令: 1. 在命令窗口 (Command Window) 中: 1) 【上、下键】 ―― 切换到之前、之后的命令,可以重复按多次来达到你想要的命令 2) clc―― 清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉 3) clear―― 这个才是清空当前工作区的变量命令,常用语句 clear all 来完成 4) 【 Tab 】键 ―― (转自版友心灯)在 matlab@hit.edu.cn 看到的:在 command 窗口,输入一个命令的前几个字符,然后按 tab 键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是: matlab6.5 版本中,如果候选命令超过 100 个,则不显示。而在 matlab7 以后版本中,则没有这个限制,均可正常提示 5) 【 Ctrl+C 】(或【 Ctrl + Break 】) ―― (转自版友 yangjin_ren )在 matlab 程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入 “Ctrl+C” 可以将运行的程序停下来,而不需要将整个 Matlab 程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。 2. 在编辑器 (Editor) 中: 1) 【 Tab 】(或【 Ctrl+] 】) ―― 增加缩进(对多行有效) 2) 【 Ctrl+ . 中文解释: 索引超出矩阵的范围 附本人遇到的问题: Attempted to access x(3); index out of bounds because numel(x)=2. 表示 x 矩阵元素不够,导致 x(3) 无法索引。 11.In an assignment A(I) = B, the number of elements in B and I must be the same 中文解释: 在赋值语句 A(I) = B 中, B 和 I 的元素个数必须相同 12.To RESHAPE the number of elements must not change 中文解释: 矩阵变换时,变换前和变换后的总元素不能改变
277 次阅读|0 个评论
分享 [CSDN] TIOBE 2013年7月编程语言排行榜:PHP强势回归
sdccumcm 2013-7-11 10:07
摘要: TIOBE编程语言排行榜如期发布,前三甲无明显变化,依然是C、Java、Objective-C。与2013年1月份相比,PHP发展的最为迅速,同比增长了+1.64%。PHP份额的提升似乎得益于2012年9月份发布最新的PHP Zend Framework。 本月, TIOBE 编程语言排行榜如期发布,前三甲无明显变化,它们是C、Java、Objective-C,其中Objective-C依然呈现上升趋势。 值得关注的是,与2013年1月份相比,PHP发展的最为迅速,同比增长了+1.64%。其次是Transact-SQL增长0.99%及PL/SQL增长0.34%。PHP流行背后似乎得益于2012年9月份发布最新的 PHP Zend Framework 。 PHP是由丹麦程序员雷斯莫斯·勒道夫(Rasmus Lerdorf)在1995年创造出来的。1997年,以色列程序员安迪·古特曼斯(Andi Gutmans)和齐弗·苏拉斯基(Zeev Suraski)重写了解析程序,从而为PHP 3奠定了基础。1999年,两人开发出了Zend Engine,到现在它仍是PHP的解释器。此后,二人继续合作,共同创建了商业化实体Zend Technologie,为PHP开发者创造扩展产品和服务,尤其是企业开发者。 许多网站都在使用PHP,包括Facebook、WordPress、维基百科、雅虎等等,此外,还包括很多内容管理系统。 以下是前20名榜单排行榜: 前10名编程语言长期走势图: 以下是21-50编程语言排名: 后50名的语言如下: (Visual) FoxPro, 4th Dimension/4D, ABC, Algol, Alice, ATLAS, Awk, bc, BlitzMax, CFML, cg, CL (OS/400), Clean, Clojure, Curl, Dart, DiBOL, Eiffel, Emacs Lisp, Factor, Icon, Inform, Io, J, JavaFX Script, JScript.NET, LabVIEW, LPC, M4, Mercury, MUMPS, NATURAL, Oberon, OCaml, OpenCL, Oz, Pike, PILOT, PostScript, Pure Data, Q, REALbasic, REXX, S, Squirrel, Standard ML, VBScript, VHDL, X10, xBase 声明: 这个榜单本身采集的是英文世界的数据,虽然在反映趋势上有一些参考意义,但与中国的实际情况不完全符合,而且,采样本身也有相当大的局限性。 【说明】 TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。 这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开发新系统时作为一个语言选择依据。排行榜的详细定义可以参考这里( 英文 )。
73 次阅读|0 个评论
分享 为什么C语言屹立不倒?
sdccumcm 2013-6-12 11:45
有些语言诞生几十年了依然是世界上最流行的语言,比如C语言。有些语言虽然号称新兴的语言却很少有人使用。在编程语言这个领域里似乎不符合长江后浪推前浪这个规律。这恐怕不止语言本身的因素,里面的缘由值得研究者好好去探索一番。 近年来,谷歌一直致力于开发出自己的编程语言以取代当今世上最常用的C、C++和JavaScript。在系统语言方向,谷歌的Go语言能够为用户在数据中心内建立大型软件提供更多的便捷,有望取代C语言和C++的地位;而在网络开发方面,谷歌希望凭借Dart取代JavaScript。编程语言的世界里可谓是江山代有人才出,可有那么一位引领**达数十年之久,它就是C语言。 编程语言之间的竞争一天也没能停歇,长江后浪推前浪,一代更比一代强。它们之中只有屈指可数的少数能够被市场接纳,成为程序员们日日夜夜的伴侣。究竟怎样的编程语言才能够成为大浪淘沙中的幸运儿?普林斯顿大学(Princeton)和加州大学伯 克利分校(University of California at Berkeley)的研究者雷欧·马耶若维奇(Leo Meyerovich)和阿里·拉布金(Ari Rabkin)希望通过自己的研究,来解开编程语言世界的丛林法则。他们在探寻一个问题——为何C语言虽垂垂老矣却能屹而不倒? 雷欧和阿里采访了数以万计的程序员,又在全球最大的软件仓库SourceForge梳理了超过30万份的程序。“为什么C语言没有被淘汰?”拉布金提出了这个问题。的确,C语言距问世之初已经有了35年的历史。在这期间里,计算机迈出了不可测量的发展步伐,软件和操作系统也早就今非昔比,编程语言中不乏叱咤风云的新生代,而C语言也有了升级版。即便如此,C语言依旧风采不减当年。 拉布金刚刚取得了加州大学伯克利分校的计算机博士学位,如今在普林斯顿大学攻读博士后学位。“在学术领域,现今的趋势是解决那些尚未出现的难题,”拉布金说,“学者们希望能够标新立异地建立起一个全新的语言系统,就没有考虑这么一套编程语言是否有实践的价值。编程语言的开发者们缺少一个明确的目标。”他指出,有些编程语言甚至缺失了最基础的东西,比如文档(Documentation);还有些开发者不停地在语言系统上画蛇添足,弄到最后搞的程序员们只能因为它太“丰富”了不得不放弃。马耶若维奇认为:“我们发现这个问题事实上不是一个技术领域的问题,它是因为整个学术界不够注重实践需求所造成的”。 新兴编程语言Scale是一个很好的例子。数据分析机构Slice-Data的创始人之一张洋(音译)是Scale众多使用者中的一员,他从2006年起开始接触Scale。Scale在问世之初文件编制就存在很大的缺陷,这给用户的学习使用造成了很大的不便和痛苦。“我当时肯定是个受虐狂。”他回忆道。 除却新兴语言本身的问题,这里面还有一个要素是程序员的学习能力。试验中收集的信息表明,因为学习新语言太辛苦困难了,程序员们在使用一款新型的编程语言前并不会认认真真地去学习一番。马耶若维奇拿Adobe公司开发的ActionScript作为例子。ActionScript是一款以用户为导向的编程语言,程序员们普遍认为ActionScript的使用比较简单。可是当要用ActionScript做新的事时,比如从媒体开发转向游戏开发,因为没有系统的学习过,他们就束手无策了。 我们普遍认为,程序员年龄越大,经验就越老道,掌握的语言就越多。事实又是怎样的呢?雷欧和阿里在试验中发现,多数程序员都掌握了3至4种程序语言,但当他们到了35-40岁时,很多人就会步入管理岗位。脱离了编程一线,学习新语言的动机和机会就大打折扣了。 马耶若维奇认为,他们正在研究的这个课题十分重要,关乎整个行业是否能够高速和健康地发展。他和拉布金把实验数据都发布在网络上,希望他人能够给出新的视角,同时为如何解决这一问题提供建议与帮助。
187 次阅读|0 个评论
qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-5-11 02:28 , Processed in 0.310774 second(s), 28 queries .

回顶部