(以下内容大多翻译自《A Beginner’s Guide to MATLAB》的第三章,是对原文的删减和改写)
1. M文件:脚本(script)和函数(function)
为了更好地利用马特拉布,我们需要学会在马特拉布中写长长的程序,而这种程序势必需要保存在一个文件里,这就是m文件。m文件得名于其后缀.m,而且只能用马特拉布编译运行m文件。
m文件分为两种,即脚本和函数。脚本m文件基本就是你把你要执行的一系列文件放在m文件中,然后在马特拉布中调用它就可以了,可以说是命令行模式的方便版。
而函数文件,可以说是用户自己的智慧结晶,它通常会有输入和输出。让我们来实际操作一下吧。
我们创建一个log3.m的函数文件,把文件里的函数也叫作log3(函数名通常和文件名一致),这个函数的作用是计算以3为底的对数
然后在命令行下调用
虽然只有短短几句,但函数文件从创建到应用的过程就是这样!麻雀虽小五脏俱全嘛。那么,接下来我们就来看看有关函数文件的语法规则吧。首先是这样的
- 关键字 function
- 输出放在圆括号里(上例为x)
- 输入放在方括号里(上例为a)
- 函数名log3(一般和文件名一致)
- end
当然,end、输入、输出根据实际情况都不一定需要,但function和函数名肯定是必需的。当然,对于函数的一些介绍可以用注释写,在这里就略去,如果你用help获取这个函数的帮助,就可以的到函数文件中注释的信息了。
2. 循环
循环一般有两种,for和while
2.1 for 循环
for循环让我们可以重复执行一些指令,当然喽,你得告诉马特拉布,循环的起止点,这样,循环才有结束的一天,而不会无限死循环。
% 一般for是这样写的
for i = 1:4 % 起点是1,重点是4,这是一个闭区间
i = 2
end
结果就是这样
在for和end包围的空间,就是你施展才华的地方,你可以里面写你需要的东西。
比如现在我想写一个for循环,让向量中的每个元素都变成自己的平方,我就可以这么写
x = 1:10;
for i = 1:10
x2(i) = x(i)^2; % matlab里面用圆括号索引向量
end
结果
和其他语言一样,马特拉布也可以嵌套for循环。作为对for嵌套循环的学习,我们用一个实际的例子——高斯消元法来阐述吧。
%% 在这个例子里,我们将编写程序,让程序能够对线性方程组
%% 执行高斯消元法,并得出Ax = b的解
function [x] = gauss_eli(A,b)
%% [x] = gauss_eli(A,b)
% 这个子程序的任务就是对线性方程Ax = b做高斯消元
% 然后进行回代,以解出Ax = b的解
%% 此函数对系数矩阵是方阵的函数适用,且无求逆步骤,因此要
% 自己提前判断系数矩阵是否可逆
N = max(size(A));
% 高斯消元
for j = 2:N
for i = j:N
m = A(i,j-1)/A(j-1, j-1);
A(i,:) = A(i,:) - A(j-1,:)*m;
b(i) = b(i) - m*b(j-1);
end
end
% 回代
x = zeros(N, 1);
x(N) = b(N)/A(N,N);
for j = N-1:-1:1
x(j) = (b(j)-A(j,j+1:N)*x(j+1:N))/A(j,j);
end
%% 函数结束
end
结果
另外一个比较实际的例子就是生成希尔伯特矩阵,其中 n × n 的 希 尔 伯 特 矩 阵 H 是 这 样 定 义 的 : H i , j = 1 i + j − 1 \displaystyle n\times n的希尔伯特矩阵H是这样定义的: H_{i,j} = \frac{1}{i+j-1} n×n的希尔伯特矩阵H是这样定义的:Hi,j=i+j−11
k = 16;
A =zeros(k,k);
for m = 1:k
for n = 1:k
A(m,n) = 1/(m+n-1);
end
end
format rat % 用分数进行显示
A
结果太大,略,可以直接复制运行验证
2.2 while循环
while循环是一种条件循环,就是把for改成while 条件,和for其实差不多。
3 if语句
所谓的if语句,就是if elseif else end这样包起来的语句结构。
比如我们要画这样一个函数
那么就可以这样
x = -1:0.01:1
for i = 1:length(x)
if x(i) < 0.5
F(i) = x(i)^2;
else
F(i) = 0.25;
end % if一定要接end
end % end for for loops
plot(x,F)
结果为