MATLAB学习笔记—循环结构

循环(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不用每次执行循环都重新改变矩阵的大小,从而缩短了运行时间(原理和内存的操作有关)

你可能感兴趣的:(MATLAB学习笔记—循环结构)