罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

如何工作

上周我提到了使用的区别1: N而且(1: N)如a中的表达式声明。我最近收到了很多关于如何在MATLAB中工作,它似乎是时候为自己的帖子。

内容

“典型的使用”

最常见的用法就是当我们想要做某件事一定次数的时候我们决定不对代码进行向量化。在这种情况下,我们通常知道总次数,N并且可以编写这样的代码:

N = 3;ind = 1:N disp(ind)结束
1 2 3

表达式可以是一个矩阵

循环使用表达式的每一列作为临时循环变量。在设计MATLAB时,克里夫告诉我,他选择了来创建行向量1: N是一种自然的表达和他的期待吗经常参与建立循环。

在MATLAB的早期,我们也可以使用一个矩阵(现在是一个n维数组)作为循环表达式。在这些情况下,MATLAB在列上迭代(将所有维度>1折叠为虚拟列)。

A =重塑(1:6,3,2);计数= 0;%显示循环计数器和循环表达式的转置count = count+1;disp([计数,印第安纳州的])结束
1 1 2 3 2 4 5 6

表达式可以走向无限!

为了方便那些没有阅读上周文章的人,我重复了一个有趣的MATLAB花絮。你可以有你的循环转到如果你不坚持预先计算要遍历的向量。

ind = 1:Inf disp(ind)如果印第安纳州> = 2 disp (停止现在的)打破结束结束印第安纳州
现在停止ind = 2

的范围

循环计数器在MATLAB中的作用域据我所知,循环不像其他语言。你可以将值重新赋给循环内的计数器,但循环会以某种方式继续执行,就好像没有发生过重新赋值一样。让我们来看一些例子。

Ind = 1:3 disp(Ind)结束印第安纳州
1 2 3 ind = 3

在这种情况下,我们没有尝试任何奇怪的事情,我们可以使用的最终值印第安纳州过去的尽头循环。对于循环计数器转到的情况也是如此

MATLAB将继续执行循环,即使在循环内部,循环变量受到干扰,除非您做如上和打破当条件满足时(当然,如果出现错误)就会退出。看这个例子:

Ind = 1:3 Ind = 10结束印第安纳州
1个= 10个= 2个= 10个= 3个= 10个= 10个= 10个

我重置印第安纳州在循环内部,但是当循环继续进行下一次循环时,它会返回到使用循环表达式来确定是否循环完成。

for的用法

在MATLAB 6.5中引入JIT/Accelerator,循环通常不会像过去那样造成很大的性能损失。我能想到使用很有意义,尽管MATLAB是一种面向向量的语言。

  • 代码不能向量化
  • 如果向量化会占用太多内存
  • 带有循环的代码更清晰,更易于维护

的问题

人们犯的主要错误是使用循环将输出分配给一个数组,该数组在循环开始之前没有预先分配。这导致MATLAB经常需要为数组重新分配内存,通常每次循环都比数组大一个元素。如果不小心,内存分配时间可能会超过计算时间。我所见过的一种模式不是公然预分配输出(而是本质上分配),它是当循环反向进行时。

N = 7;N:-1:1 B(ind) = ind如果ind <= N-1打破结束结束
B = 0 0 0 0 0 0 7 B = 0 0 0 0 0 6 7

何时,如何,以及为什么使用循环?你知道其他需要注意的危险吗?发表你的想法在这里


使用MATLAB®7.2发布


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。