循环(Loops)
循环,顾名思义,将一件事重复执行。
我们之前已经不知不觉用到了循环。当然,是MATLAB内建的函数使用到了循环的思想。
比如:
>> n = 1:5
>> total = sum(n)
for循环(for-loop)
下面来看一下MATLAB中是如何使用for循环的;
function suminput(n)
total = 0
for n = 1:5 %控制语句
total = total + n %循环主体
end
fprint('total equals %d\n',total);
控制语句n = 1:5
并非一定要用克隆运算符。看下面这个例子
list = rand(1,5);
for x = list
if x > 0.5
fprint('Random number %f is large.\n',x)
else
fprint('Random number %f is small.\n',x)
end
end
当然,也可以不用list,直接for x = rand(1,5)
注意:循环中使用到的序列不一定要是整数、或是有固定间隔、或是严格增长。
while循环(while-loop)
当我们并不知道循环要执行多久,需要用while循环结构。
function [n total] = possum(limit)
total = 0;
n = 0;
while total <= limit
n = n + 1;
total = total + n;
end
fprintf('sum: %d count : %d\n, total, n);
与for循环的区别:循环体和判断都要重复执行。
如果遇到死循环,或是想快点结束的话:Ctrl+C
break语句
跳出当前循环,通常用来提前中断循环结构。
注:break只能跳出一层循环。
要跳出整个循环,需要用到一个变量来进行判断,内循环跳出之前改变其值,外循环判断,跳出。
分块(Section)
在脚本中可以将代码分块,来执行不同的功能。分块的标记是%%
。两个标记中间为一个可执行的区域。
逻辑索引(Logical indexing)
将v阵中大于等于0的元素取出,放到w中:
w = v(v >= 0)
逻辑数列(logical arrays)
[4 -1 7 5 3] > [5 -9 6 5 -3]
ans=
0 1 1 0 1
c = [2>1, 2<1, ~(3>2 && 4>5)]
c = 1 0 1
holmes = logical([1 -2 0 0 9.12 -2])
holmes = 1 1 0 0 1 1
会发现真为1,假为0。其中1和0被称作逻辑变量。
a = 1 2 3
c = 1 0 1 %之前生成的
a(c) = 1 3
从上面可以看出来,a(c)输出的是索引c中为真的元素。
所以就可以有很多种玩法:
v_10 = v(confidence >= 10)
confidence中大于等于10的元素建立索引,然后v按照此索引输出v_10
v_bigger = v(v > v0)
取出v中元素比v0对应元素大的
v(v<0) = 0
将v中的负数替换为0
v(v<0) = [100 200]
将v中的第一个负数替换为100,第二个替换为200
v(v<0) = v(v<0) + 100
将v中负数加100
那么如果是数阵呢?
A = [1 2 3;4 5 6];
A = 1 2 3
4 5 6
B = A(A > 2)
B =
4
5
3
6
最后输出的是一个列矩阵。
因为矩阵是按列从上到下索引的,譬如1
是1号,4
是2号,2
是3号,以此类推。
例子:
A(A >= 0) = 100:108
,前提是A中大于等于0的个数要和后面的个数相等
A(A>B) = A(A>B) - B(A>B)
预先配置(Preallocation)
计时
tic; sum(1:1e3); toc
可以计算tick tock中间函数运行的时间
预配置
function noprealloc
N = 5000
for ii = 1:N
for jj = 1:N
A(ii,jj) = ii*jj;
end
end
上面这个函数运行时间会非常的久。
function prealloc
N = 5000;
A = zeros(N,N);
for ii = 1:N
for jj = 1:N
A(ii,jj) = ii*jj;
end
end
但如果我们加一句,函数运行所需时间就会大大减少,这是为什么呢?
原因就在下面的函数多了一句初始化A的语句。这样一来MATLAB不用每次执行循环都重新改变矩阵的大小,从而缩短了运行时间(原理和内存的操作有关)