MATLAB基础入门

发布时间:2024-01-22 02:10:47

MATLAB

MATLAB基础

MATLAB 是美国 Math Works 公司开发的科学计算软件,在科学研究和工程技术领域得到了广泛的应用,被认为是目前最优秀的科学计算软件之一。

操作界面

请添加图片描述


注释

  • %
  • 也可以用快捷键Ctrl+R, 先选中代码再摁快捷键, 支持多行注释
  • 点击Ctrl+T,取消注释程序
  • 如果多行也可以用%{ %}

举个栗子:

X = rand(3)

%{
n = length(X)
b = 0;
for i = 1:n
    for a = 1:n
        x = X(i,a);
        b = b + x;
    end
    
%}
    
%     disp([num2str(b)]);
    c = b/10;
% 
%     disp(['第',num2str(i),'行的平均值为',num2str(c) ]);
% end

输入/输出操作

  • disp() : 显示变量的值

    • disp(X) 显示变量 X 的值,而不打印变量名称。显示变量的另一种方法是键入它的名称,这种方法会在值前面显示一个前导 “X =”。
    A = [15 150];
    S = 'Hello World.';
    disp(A);
    disp(S);
    disp("Hello World.");
    

    输出 :

    15   150
    Hello World.
    Hello World.
    

    注 :第二个disp(S);已经自动换行

    • 如果变量包含空数组,则会返回 disp,但不显示任何内容。
    • 输出结果后自动换行, 一行只能接收一个变量, 如果在同一行输出多个变量加[]
    name = 'Alice';   
    age = 12;
    X = [name,' will be ',num2str(age),' this year.'];
    disp(X)
    

    输出 :

    Alice will be 12 this year.
    
    • 不同维度的矩阵不能在同一行输出
    A = rand(3);
    B = rand(2);
    C = rand(1);
    disp([A,B,C]);
    

    输出 : (报错)

    错误使用 horzcat
    要串联的数组的维度不一致。
    
  • sprintf() :输入操作; 可以创建文本

    name = 'Alice';   
    age = 12;
    X = sprintf('%s will be %d this year.',name,age); % 创建文本
    disp(X) % 直接输出文本
    

    输出 :

    Alice will be 12 this year.
    
  • fprintf() 输出操作; 格式化输出, 与C语言中的printf相似

    • 使用 fprintf 直接显示文本,无需创建变量。
    • 输出结果不换行, 要换行就要添加\n
    name = 'Alice';   
    age = 12;
    fprintf('%s will be %d this year.',name,age);
    fprintf("此处不换行");
    fprintf("\n");
    fprintf('%s will be %d this year.\n',name,age);
    fprintf("hello");
    

    输出 :

    Alice will be 12 this year.此处不换行
    Alice will be 12 this year.
    hello
    

矩阵操作

  • 矩阵是MATLAB的基础, 是MATLAB运算的基本单元, 即MATLAB中,基本的运算元素是矩阵,而不是其它高级语言中的基本数据类型。即使一个自然数,也被看成是1*1的矩阵。
>> x = [1,2,3,4]

x =

     1     2     3     4

>> x = [1,2,3,4];

说明 : 加分号和不加分号的区别

如果希望即时看到命令执行结果,则在命令后不加分号,否则在命令后加分号。程序中, 大多数情况下每条语句后要加分号。如果希望看到中间结果,则在语句后不加分号。

  • 矩阵创建的方式

    • 冒号

      • >> x = [1,2,3,4];
        >> x = 1:4
        
        x =
        
             1     2     3     4
        
        >> x = 1:2:4
        
        x =
        
             1     3
        
      • 冒号方式只能创建规则排列一维向量;

      • 若冒号连接三个常量时,中间的为步长; 比如 : x = 1:2:4 ; 中间的2就为步长, 增量为2, 即一位矩阵[1,3]

      • 若冒号连接两个常量, 则默认步长为1

    • 函数

      • >> y = rand(3)
        
        y =
        
            0.8147    0.9134    0.2785
            0.9058    0.6324    0.5469
            0.1270    0.0975    0.9575
        
        >> z = eye(4,3)
        
        z =
        
             1     0     0
             0     1     0
             0     0     1
             0     0     0
        
        >> z = eye(4)
        
        z =
        
             1     0     0     0
             0     1     0     0
             0     0     1     0
             0     0     0     1
        
        >> x = zeros(3,3)
        
        x =
        
             0     0     0
             0     0     0
             0     0     0
        
        >> x = zeros(4)
        
        x =
        
             0     0     0     0
             0     0     0     0
             0     0     0     0
             0     0     0     0
        
        
      • 例如函数 zeros(), rand(), eye()

      • 还有很多其它函数可以产生矩阵函数

      • 只带一个参数时,表示产生的方阵

  • 子矩阵

    • A = rand(3);
      B = A(2,2:3); % 取A矩阵的第2行的第2到3列的元素
      C = A(2:3,:); % 取A矩阵的第2到3行的所有元素; 
      D = A(2,3); % 取A矩阵的第2行第3列元素
      E = A(:,2:3); % 取A矩阵的所有行的第2到3列
      disp(A);
      disp(B);
      disp(C);
      disp(D);
      disp(E);
      

    输出 :

     0.2511    0.3517    0.5497
     0.6160    0.8308    0.9172
     0.4733    0.5853    0.2858
    
     0.8308    0.9172
    
     0.6160    0.8308    0.9172
     0.4733    0.5853    0.2858
    
     0.9172
    
     0.3517    0.5497
     0.8308    0.9172
     0.5853    0.2858
    

    ? A(:😅; 如果要抽取的是整个矩阵的所有行或列,则直接用冒号表示


  • 合并矩阵

    A = rand(2,3);
    B = zeros(1,3);
    C = ones(2,1);
    D = [A;B]; %垂直合并, 两个矩阵的列数要相同
    E = [A,C]; %水平合并, 两个矩阵的行数要相同
    disp(A);
    disp(B);
    disp(C);
    disp(D);
    disp(E);
    

    输出 :

        0.7572    0.3804    0.0759
        0.7537    0.5678    0.0540
    
         0     0     0
    
         1
         1
    
        0.7572    0.3804    0.0759
        0.7537    0.5678    0.0540
             0         0         0
    
        0.7572    0.3804    0.0759    1.0000
        0.7537    0.5678    0.0540    1.0000
    
  • 矩阵元素的访问

    • 单个元素
    • 连续多个
    • 不连续多个
    A =  rand(2,3);
    % 单个元素
    x = A(1,3);
    y = A(3);
    
    % 连续元素
    X = A(1,2:3);
    Y = A(:,3);
    
    % 不连续元素
    
    a = A(1,[1,3]); % 第1行对应的第1列和第3列的元素
    b = A([1,2],2); % 第1行和第2行对应的第2列的元素
    
    disp(A);
    disp(X);
    disp(Y);
    disp(x);
    disp(y);
    disp(a);
    disp(b);
    

    输出 :

        0.5383    0.0782    0.1067
        0.9961    0.4427    0.9619
    
        0.0782    0.1067
    
        0.1067
        0.9619
    
        0.1067
    
        0.0782
    
        0.5383    0.1067
    
        0.0782
        0.4427
    

矩阵运算符

表达式使用大家熟悉的算术运算符和优先法则。

+加法
-减法
*乘法
/除法
\左除
^
'复共轭转置
( )指定计算顺序

数组运算符

如果矩阵不用于线性代数运算,则成为二维数值数组。数组的算术运算按元素执行。这意味着,加法和减法运算对数组和矩阵都是相同的,但乘法运算不相同。MATLAB 的乘法数组运算表示法中包含点,也就是小数点。

运算符列表包括

+加法
-减法
.*逐元素乘法
./逐元素除法
.\逐元素左除
.^逐元素幂
.'非共轭数组转置

如果使用数组乘法将丢勒的幻方矩阵自乘

A.*A

则会生成一个数组,该数组包含介于 1 至 16 之间的整数的平方,并且以不常见的顺序排列:

ans =
   256     9     4   169
    25   100   121    64
    81    36    49   144
    16   225   196     1

注意 :点乘与乘的区别; 点乘是对矩阵中的每个元素对应相乘, 要求两个矩阵行列大小相同; 乘法是遵循矩阵运算规则

构建表

数组运算对构建表非常有用。假定 n 为列向量

n = (0:9)';

然后,

pows = [n  n.^2  2.^n]

构建一个平方和 2 次幂的表:

pows =
     0     0     1
     1     1     2
     2     4     4
     3     9     8
     4    16    16
     5    25    32
     6    36    64
     7    49   128
     8    64   256
     9    81   512

初等数学函数逐元素处理数组元素。因此

format short g
x = (1:0.1:2)';
logs = [x log10(x)]

构建一个对数表。

 logs =
      1.0            0 
      1.1      0.04139
      1.2      0.07918
      1.3      0.11394
      1.4      0.14613
      1.5      0.17609
      1.6      0.20412
      1.7      0.23045
      1.8      0.25527
      1.9      0.27875
      2.0      0.30103

统计一个矩阵所含的元素个数

第一种 : 用size()函数来统计行和列, 然后再让行和列相乘得到总数

a = [1,2,4;1,3,5;4,32,34];
[m,n] = size(a);
num = m*n;
disp("统计矩阵的元素个数");
disp(['该矩阵的行数 : ',num2str(m),' 列数 : ',num2str(n)]);
disp(['该矩阵的元素个数为 :',num2str(num)]);

输出 :

统计矩阵的元素个数
该矩阵的行数 : 3 列数 : 3
该矩阵的元素个数为 :9

第二种 : 用length()函数, 直接计算出矩阵个数

a = [1,2,4;1,3,5;4,32,34];
num = length(a(:));
disp("统计矩阵的元素个数");
disp(['该矩阵的元素个数为 :',num2str(num)]);

输出 :

统计矩阵的元素个数
该矩阵的元素个数为 :9

注意 :如果用 length(a); 统计的结果只是行或列, 而且a必须是方阵, 即行数等于列数.

运算符

逻辑运算符

  • ==
  • >
  • <
  • >=
  • <=
  • ~= : 不等于

关系运算符

  • & : 与
  • | : 或
  • ~ :非

常用的数据类型

  • double : 默认数值型

  • single : 单精度数组

常用的常量值。

pi3.14159265…
i虚数单位 G?1
ji 相同
eps浮点相对精度 ε=2?52
realmin最小浮点数 2?1022
realmax最大浮点数 (2?ε)21023
Inf无穷大
NaN非数字; 非数值类型
intmax最大整型数
intmin最小整型数

通过将非零值除以零或计算明确定义的溢出(即超过 realmax)的数学表达式,会生成无穷大。通过尝试计算 0/0Inf-Inf 等没有明确定义的数值的表达式,会生成非数字。

函数名称不会保留。您可以使用如下新变量覆盖任何函数名称

eps = 1.e-6

并在后续计算中使用该值。可以使用以下命令恢复原始函数

clear eps

脚本文件

  • 程序: MATLAB的程序文件以.m为扩展名,由命令、函数和语句构成,可以在命令窗口以命令的方式(文件名即命令名)直接运行,亦可以程序方式运行

  • 脚本文件:没有参数

  • 自定义函数:以function作为引导语句, 文件名与函数名相同,可以有参数,亦可以没有参数


函数

MATLAB 提供了大量标准初等数学函数,包括 abssqrtexpsin。生成负数的平方根或对数不会导致错误;系统会自动生成相应的复数结果。MATLAB 还提供了许多其他高等数学函数,包括贝塞尔函数和伽玛函数。其中的大多数函数都接受复数参数。有关初等数学函数的列表,请键入

help elfun

有关更多高等数学函数和矩阵函数的列表,请键入

help specfun
help elmat

某些函数(例如,sqrtsin)是内置函数。内置函数是 MATLAB 核心的一部分,因此这些函数非常高效,但计算详细信息是不可访问的。其他函数使用 MATLAB 编程语言实现,因此可以访问其计算详细信息。

内置函数与其他函数之间存在一些差异。例如,对于内置函数,看不到代码。对于其他函数,可以看到代码,甚至可以根据需要修改代码。

声明函数

function

声明函数名称、输入和输出

语法

function [y1,...,yN] = myfun(x1,...,xM)

说明 :

function [y1,...,yN] = myfun(x1,...,xM) 声明名为 myfun 的函数,该函数接受输入 x1,...,xM 并返回输出 y1,...,yN。此声明语句必须是函数的第一个可执行代码行。有效的函数名称以字母字符开头,并且可以包含字母、数字或下划线。

可以将函数保存在以下位置:

  • 只包含函数定义的函数文件中。文件的名称应与文件中其函数的名称一致。
  • 包含命令和函数定义的脚本文件中。函数必须位于该文件的末尾。脚本文件不能与文件中的函数具有相同的名称。R2016b 或更高版本的脚本中支持函数。

文件可以包含多个局部函数或嵌套函数。为提高可读性,可使用 end关键字来表示文件中每个函数的末尾。以下情况下需要 end 关键字:

  • 文件中有任意函数包含嵌套函数。
  • 该函数是函数文件中的局部函数,并且文件中有局部函数使用 end 关键字。
  • 该函数是脚本文件内的局部函数。

包含一个输出的函数

在名为 average.m 的文件中定义一个函数,该函数接受一个输入向量,计算各个值的平均值,然后返回单个结果。

function y = average(x)
if ~isvector(x)
    error('Input must be a vector')
end
y = sum(x)/length(x); 
end

从命令行调用该函数。

z = 1:99;
average(z)

输出 :

ans =
    50

脚本文件中的函数

在名为 integrationScript.m 的文件中定义一个脚本,以计算被积函数在 2 π / 3 2\pi / 3 2π/3 处的值,并计算曲线下方从 0 到 π \pi π 的面积。包括一个局部函数,用于定义被积函数 y = s i n ( x ) 3 y=sin(x)^3 y=sin(x)3

注意: 在脚本中包括函数需要安装 MATLAB? R2016b 或更高版本。

% Compute the value of the integrand at 2*pi/3.
x = 2*pi/3;
y = myIntegrand(x)

% Compute the area under the curve from 0 to pi.
xmin = 0;
xmax = pi;
f = @myIntegrand;
a = integral(f,xmin,xmax)

function y = myIntegrand(x)
y = sin(x).^3;
end

输出 :

y =

    0.6495


a =

    1.3333

包含多个输出的函数

在名为 stat.m 的文件中定义一个函数,该函数返回输入向量的均值和标准差。

function [m,s] = stat(x)
n = length(x);
m = sum(x)/n;
s = sqrt(sum((x-m).^2/n));
end

从命令行调用该函数。

values = [12.7, 45.4, 98.9, 26.6, 53.1];
[ave,stdev] = stat(values)
ave =
   47.3400
stdev =
   29.4124

函数文件中的多个函数

在名为 stat2.m 的文件中定义两个函数,其中第一个函数调用第二个函数。

function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end

function m = avg(x,n)
m = sum(x)/n;
end

函数 avg局部函数。局部函数仅可供同一文件中的其他函数使用。

从命令行调用函数 stat2

values = [12.7, 45.4, 98.9, 26.6, 53.1];
[ave,stdev] = stat2(values)
ave =
   47.3400
stdev =
   29.4124

调用函数

MATLAB提供了大量执行计算任务的函数。在其他编程语言中,函数等同于子例程或方法。

要调用函数,例如 max,请将其输入参数括在圆括号中:

A = [1 3 5];
max(A)

输出 :

ans = 5

如果存在多个输入参数,请使用逗号加以分隔:

B = [10 6 4];
max(A,B)

输出 :

ans = 1×3

    10     6     5

通过将函数赋值给变量,返回该函数的输出:

maxA = max(A)

输出 :

maxA = 5

如果存在多个输出参数,请将其括在方括号中:

[maxA,location] = max(A)

输出 :

maxA = 5
location = 3

将任何字符输入括在单引号中:

disp('hello world')

输出 :

hello world

要调用不需要任何输入且不会返回任何输出的函数,请只键入函数名称:

clc

clc 函数清空命令行窗口。


常用的绘图函数

  • plot() : 二维线图
  • plot3() : 三维线图
  • bar() : 条形图
  • bar3() : 三维条形图
  • stem() : 离散序列数据
  • stair() : 阶梯图的外观和行为
  • scatter() : 散点图
  • contour() : 矩阵的等高线图
  • surf() : 曲面图
  • mesh() : 网格图

MATLAB程序

习题

题目一 : 生成一个10行10列的随机矩阵,求每行的平均值,并求最大,平均值的行号

X = rand(10)
n = length(X);
maxx = realmin;
for i = 1:n
    b = 0;
    for a = 1:n
        x = X(i,a);
        b = b + x;
    end  
    c = b/n;
    disp(['第',num2str(i),'行的平均值为',num2str(c)]);
    if c > maxx
        maxx = c;
        h = i;
    end 
end
disp(['最大平均值的行号为第',num2str(h),'行, 最大平均值为',num2str(maxx)]);   
   

提示 : 改变量名的时候, shift+enter可以全部换掉你要改的实例; 就是如果要换一个变量名可能要多处修改, 但只需修改一次后摁快捷键shift+enter就可以全部自动换成你改后的名字.

输出结果 :

>> 

X =

    0.9411    0.5608    0.1924    0.3720    0.0727    0.2103    0.5262    0.7267    0.7158    0.5092
    0.6616    0.0011    0.5675    0.7076    0.4403    0.6836    0.7969    0.8863    0.4886    0.8041
    0.2149    0.1269    0.6577    0.3457    0.6065    0.1544    0.2737    0.0519    0.0781    0.5098
    0.9136    0.2146    0.6856    0.8772    0.3048    0.9743    0.2927    0.0786    0.5301    0.3027
    0.3802    0.8268    0.3537    0.7505    0.4066    0.5027    0.3482    0.0145    0.6661    0.8619
    0.0350    0.3876    0.9568    0.4344    0.1010    0.8914    0.8760    0.1933    0.6077    0.0574
    0.2273    0.3181    0.2437    0.4007    0.4769    0.7265    0.0933    0.0263    0.4196    0.7308
    0.9069    0.2618    0.7483    0.3729    0.2924    0.4972    0.2067    0.4688    0.1108    0.9009
    0.8690    0.2965    0.3902    0.4433    0.0163    0.6072    0.3028    0.2434    0.8166    0.4640
    0.5825    0.4282    0.8448    0.3803    0.8844    0.3493    0.3515    0.9199    0.2493    0.4694

第1行的平均值为0.48272
第2行的平均值为0.60377
第3行的平均值为0.30195
第4行的平均值为0.51741
第5行的平均值为0.51112
第6行的平均值为0.45407
第7行的平均值为0.36631
第8行的平均值为0.47666
第9行的平均值为0.44493
第10行的平均值为0.54595
最大平均值的行号为第2行, 最大平均值为0.60377

更简单的做法 : 直接使用mean函数 ; 具体用法查看matlab帮助文档

X = rand(10)
c = mean(X,2)
d = max(c)

输出 :

X =

    0.6359    0.4593    0.1877    0.5936    0.1389    0.8371    0.5115    0.4979    0.6632    0.1280
    0.6439    0.9100    0.7073    0.9782    0.0727    0.7505    0.0082    0.0793    0.3725    0.4361
    0.5057    0.6341    0.4134    0.8696    0.8945    0.1485    0.1319    0.5788    0.8151    0.0197
    0.9272    0.0645    0.6038    0.6581    0.0928    0.6539    0.4356    0.7409    0.6852    0.6954
    0.7275    0.5365    0.8684    0.0085    0.8405    0.3440    0.7618    0.7221    0.0714    0.7716
    0.8449    0.9733    0.7319    0.8595    0.6313    0.0765    0.9717    0.8373    0.4302    0.1556
    0.6491    0.3836    0.9052    0.9979    0.1549    0.3966    0.3769    0.3031    0.5271    0.4758
    0.9578    0.8383    0.0236    0.7566    0.6403    0.0169    0.8341    0.5261    0.1128    0.0884
    0.2787    0.6624    0.8970    0.2585    0.1897    0.9569    0.0434    0.2266    0.4113    0.3872
    0.5638    0.7185    0.1387    0.2590    0.9680    0.5396    0.2963    0.7331    0.0017    0.7075


c =

    0.4653
    0.4959
    0.5011
    0.5557
    0.5652
    0.6512
    0.5170
    0.4795
    0.4312
    0.4926


d =

    0.6512


使用以下内容可以将元素追加到矩阵中(列添加)

A = [A elem]    % 追加元素到数组中或矩阵

或行添加

A = [A; elem]   % 追加元素到矩阵中

另一个更简单的方法是 (使用end关键字)适用于行向量和列向量.

A(end+1) = elem; %将元素追加到末尾

可以结合循环来追加


题目二 : 写一个函数, x-mysort (x),要求用冒泡法对x排序,并用测试程序对其进行测试

%固定数组测试冒泡排序
fprintf("下面为整数数组\n");
x = [0,9,3,4,1,8,2,9,4,2,11,23,57,21,100,102]
fprintf("该排序为:\n");
x = mysort(x);

% 随机整数数组测试冒泡排序
fprintf("\n下面为随机整数数组\n");
t = round(rand(1,12)*100)
fprintf("该排序为:\n");
t = mysort(t);

% 函数定义
function x = mysort(x)
    n = length(x);
    for i = 1:n 
        for j = 1:(n-i)
            if x(j)>x(j+1)
                a = 0;
                a = x(j);
                x(j) = x(j+1);
                x(j+1) = a;
            end
        end
    end
    disp(['排序结果为: ',num2str(x)]);
%     fprintf("排序结果为%d", x);
end

输出:

下面为整数数组

x =

     0     9     3     4     1     8     2     9     4     2    11    23    57    21   100   102

该排序为:
排序结果为: 0    1    2    2    3    4    4    8    9    9   11   21   23   57  100  102

下面为随机整数数组

t =

    91     9    18    95    10    39    29     7    19    42    29    70

该排序为:
排序结果为: 7   9  10  18  19  29  29  39  42  70  91  95

小tips : 在命令窗口输入: clc 回车 ; 可以清空结果;

产生随机整数数组的方法 :

t = round(rand(1,12)*100) %产生十二个整数, 整数取值范围为1到100

题目三 : 画出函数 y = c o s x ( 0.5 + 3 s i n x 1 + x 2 ) y=cosx (0.5 + \frac{3sinx}{1+x^2}) y=cosx(0.5+1+x23sinx?)?在 [ 0 , 2 π ] [0,2\pi] [0,2π]?区间的曲线

  • 该画法错误, x和y都是矩阵, 也叫向量, 因此他们之间的运算就不能用矩阵的运算来得到结果, 而是对应位置元素与对应位置元素的运算才是这个函数表达式的结果 (即一个x对应一个y)。

x = 0:0.001:2*pi;
y = cos(x)*(0.5+3*sin(x)/(1+x.^2)); 

% y = cos(x)*(0.5+3*sin(x)/(1+x.*x)); %或者用.*

plot(x, y, 'r'); %实线
% plot(x, y, 'r+'); %粗线
% plot(x, y, 'r-'); %细线
% plot(x, y, 'r:'); %虚线
% y1 = cos(x)*(0.5+3*sin(x)/(1+x.^2)); 
% y2 = cos(x)*(0.5+3*sin(x)/(1+x.*x)); 
% plot(x, y1, 'r:', x, y2, 'b'); %画两条曲线

画出的图:

请添加图片描述

  • 正确的画法

  • 第一种 :

    x = 0:0.001:2*pi; % x取值范围0到2π, 步长为0.001
    y = cos(x).*(0.5+3*sin(x)./(1+x.^2));  % 函数表达式; 常数与矩阵点乘和乘都一样
    plot(x, y, 'r'); % 红色曲线
    

    绘图为 :

请添加图片描述

  • 第二种 :
x = 0 : 0.001: 2*pi;
n = length(x);
y = zeros(1,n); % 为y预分配内存
for i = 1:n
    y(i) = cos(x(i))*(0.5+3*sin(x(i))/(1+x(i)^2));
end
 plot(x, y, 'r'); 

绘图为 :

请添加图片描述

第二种的做法就相对繁琐些, 还是第一种直接用点乘最方便

matlab帮助文档

matlab官方帮助文档 : https://ww2.mathworks.cn/help/matlab/index.html

文章来源:https://blog.csdn.net/honorzoey/article/details/120282584
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。