【数学建模|Matlab】Matlab「基础知识」和「基础操作」

发布于:2025-07-23 ⋅ 阅读:(25) ⋅ 点赞:(0)

- 第 114 篇 -
Date: 2025 - 07 - 22
Author: 郑龙浩(仟墨)

一 窗口认识

1 当前文件夹

最左侧有一个当前文件夹

最上方的横框中表示的就是当前文件夹的路径,可以将想打开的文件夹copy到这

2 命令行窗口 与 编辑器

命令行窗口:

在中间的是命令行窗口,是我们直接操作的地方

在这比如输入

1 + 2

按一下回车,就会得出:

ans = 
	3

可以直接进行计算

还可以定义变量,比如输入a = 3回车,再输入b = 5回车,再输入a - b得到

ans = 
	-2

编辑器:

单击主页中的新建,选择脚本,此时就可以新建一个脚本,以.m结尾

这个脚本就在编辑器中打开了

可以提前将代码写在编辑器的注释中,然后想运行哪段代码,就选中那部分,然后右击,选择在命令行窗口执行所选内容之类的选项,就可以在命令行窗口中执行对应的命令了。

4 工作区

当输入命令的时候,右侧的工作区窗口内会显示当前的操作以及变量

二 基本知识与操作

1 命名规则

  • 变量名区分大小写
  • 变量名必须是以字母开头,可以是由字母、数字、下划线组成的,不可以有其他的字符
  • 变量名有对应的长度要求,但是一般不会写这么长,写的名字应该尽量简洁明了

2 清空命令和工作区

  • clear all 清空工作区窗口的所有变量(内容)
  • clc 清空命令行窗口的所有命令(内容)

3 注释

在matlab中如果想进行注释,两种

  • 两个百分号

    在开头和结尾需要写两个%%

    %% 注释
    123
    4556
    %%
    
  • %

    一行注释,只需要在某行的开头写一个%即可

    % 注释1
    % 注释2
    

4 数据类型 - 数字

1
23
56
全都是

5 数据类型 - 字符、字符串

% 字符
ch = 'a'
% 字符串
str = 'abcdef'

字符在内存中是以 ASCIl 码进行存储的,所以也是可以计算的,Eg:

字符‘a’的码:97

>> ch = 'a'
ch + 1
char(97)

ch =

    'a'


ans =

    98


ans =

    'a'

char可以将对应ASCII码转为字符,length可以得出字符串长度

>> length('abc')

ans =

     3

6 数据类型 - 矩阵

  • 矩阵的创建
>> A = [1 2 3; 4 5 6; 7 8 9]

A =

     1     2     3
     4     5     6
     7     8     9
  • 矩阵的转置

    行变列,列变行

>> A'
ans =

     1     4     7
     2     5     8
     3     6     9
  • 将矩阵 A 的所有元素按列优先顺序重新排列成一个列向量
>> A(:) 

ans =

     1
     4
     7
     2
     5
     8
     3
     6
     9

这个会用于比如求和
在执行sum(A)的时候是将每一列求和,答案是 [5 7 9](即 1+4, 2+5, 3+6)

想要将所有元素求和,就得将A中的所有元素展开为列向量(A(😃),然后在求和

sum(A(:))   % 输出: 45
  • 矩阵的逆

    • 必须方阵

    • 如果矩阵是奇异或者非奇异会警告

    A = [1 2 3; 4 5 6; 2 3 5]
    inv(A) % 求矩阵的逆
    % 结果为:
       -2.3333    0.3333    1.0000
        2.6667    0.3333   -2.0000
       -0.6667   -0.3333    1.0000
    
  • 两个矩阵的运算

    按照矩阵运算进行计算的

    A * B
    A / B
    A + B
    A - b
    % 结果
    >> A * B
    A / B
    A + B
    A - B
    
    ans =
    
        40     7    19
        88    22    49
        65    12    33
    
    
    ans =
    
        0.5984    0.1024   -0.0236
        1.1890    0.7165   -0.1654
        0.9370    0.0945    0.0551
    
    
    ans =
    
         2     5     8
        10     7     7
        11     3     9
    
    
    ans =
    
         0    -1    -2
        -2     3     5
        -7     3     1
    
  • 创建全为0的矩阵 二维三维都可以

    zeros(x,y,z)
    x为行
    y为列
    z为三维维度
    
    >> A = zeros(5)
    A = zeros(2, 5)
    A = zeros(2, 5, 3)
    
    A =
    
         0     0     0     0     0
         0     0     0     0     0
         0     0     0     0     0
         0     0     0     0     0
         0     0     0     0     0
    
    
    A =
    
         0     0     0     0     0
         0     0     0     0     0
    
    
    A(:,:,1) =
    
         0     0     0     0     0
         0     0     0     0     0
    
    
    A(:,:,2) =
    
         0     0     0     0     0
         0     0     0     0     0
    
    
    A(:,:,3) =
    
         0     0     0     0     0
         0     0     0     0     0
    
  • 单位矩阵

    生成单位矩阵(对角线为 1,其余为 0)

    eye(n)       % n×n 单位矩阵
    eye(m, n)    % m×n 的矩形单位矩阵
    
  • 幻方矩阵

    magic 英文:魔方

    各行、列、对角线之和相等

    magic(n)    % n×n 的幻方矩阵(n ≥ 3)
    

7 数据类型 - 元胞数组

① 基本介绍

其中每一个存储的独立数据单元叫做元胞

MATLAB 的元胞数组类似 C 中的结构体,但更灵活——每个单元可以存任意类型数据(数字、文本、矩阵等),无需像 C 那样提前定义类型,直接通过 {} 访问内容

在C中是这样

struct Data {
    int num;
    char str[10];
    float arr[2][2];
};
struct Data B = {10, "hello", {{1,2},{3,4}}};
printf("%s", B.str);  // 输出: hello

在matlab中是这样

disp()是输出函数

A = {10, 'hello', [1 2; 3 4]};  % 混合类型
disp(A{1});
disp(A{2});
disp(A{3});
%% 打印 
    10

hello
     1     2
     3     4
%%

② 使用{}创建元胞数组

B = {'text', 100, magic(3)};  % 创建1×3元胞数组
C = {1, 'a'; [2 3], true};    % 创建2×2元胞数组

③ 使用cell()创建元胞数组

D = cell(2,3);  % 创建2×3空元胞数组
D{1,1} = 'MATLAB';  % 填充数据
D{2,2} = 1:5;

元胞也可以存储矩阵

8 数据类型 - 结构体

(1)基本介绍

类似于Python中的字典

结构体是一种可以存储不同类型数据的容器

每个字段可以存数字、文本、矩阵等任意数据

(2)创建

% 方法1:直接赋值
student.name = 'matlab';
student.nums = 20;

% 方法2:用 struct() 函数
teacher = struct('name', 'aaa', 'subject', 'Math');

(3) 访问字段/属性 ,修改新增字段

disp(student.name);  % 输出: matlab、
student.age = 21;  % 修改字段
student.grade = [90, 85];  % 新增字段

(4)student.name(1) vs student.name{1}

student.name(1)

  • 用于:结构体字段是普通数组/字符串

  • 作用:取字段内容的第1个元素 取出的是对应的数据类型的值

    student.name = 'Alice';
    student.name(1) % 输出 'A',取出的是字符
    

student.name{1}

  • 用于:结构体字段是元胞数组

  • 作用:取元胞数组的第1个元胞的内容,取出的是cell类型

    student.name = {'Alice', 'Bob'};
    disp(student.name{1});  % 输出 'Alice'(字符串,是元胞的内容)
    disp(student.name(1));  % 输出 {'Alice'}(cell 类型)
    

8 生成随机数

函数 输出类型 默认范围 用途
rand 浮点数 [0,1) 均匀分布模拟
randn 浮点数 N(0,1) 正态分布模拟
randi 整数 [1,imax] 离散随机选择
  • rand()

    功能:生成[0,1)均匀分布的浮点数

      rand(m,n)       % m×n矩阵
      rand([m n])     % 同上
      rand(size(A))   % 与A同维
    
  • randn()

    功能:生成标准正态分布(均值μ=0,方差σ²=1)的随机数

    randn(m,n)      % m×n矩阵
    
  • randi()

    功能:生成均匀分布的随机整数

    randi(imax)         % 1个[1,imax]整数
    randi(imax,m,n)     % m×n矩阵
    randi([imin,imax])  % 指定范围
    

三 矩阵操作

1 矩阵的创建

A = [1 2 3; 2 3 5; 4 5 2]
B = 1: 2: 9 % 生成等差数列的行向量
%% 特殊矩阵
zeros(m, n) % m * n 全零矩阵
ones(m, n) % m * n 全1
eye(m, n) % 单位矩阵
rand(m, n) % 范围[0,1), 均匀分布随机矩阵 m * n
randn(m, n) % 标准正态分布随机矩阵
magic(n) % 幻方矩阵
diag(v) % 对角矩阵
%%
函数 作用
zeros(m,n) 全零矩阵 zeros(2,3) → 2×3零矩阵
ones(m,n) 全1矩阵 ones(1,4) → [1 1 1 1]
eye(m,n) 单位矩阵(对角线为1) eye(3) → 3×3单位矩阵
rand(m,n) [0,1)均匀分布随机矩阵 rand(2,2) → 2×2随机数
randn(m,n) 标准正态分布随机矩阵 randn(3,1) → 3×1随机数
magic(n) 幻方矩阵(行、列、对角线之和相等) magic(3) → 3×3幻方
diag(v) 用向量生成对角矩阵 diag([1 2]) → [1 0; 0 2]

2 四则运算

如果不加.就是指的用矩阵的运算规则计算

如果.,就是指的对应元素相乘相除

% 定义修改后的矩阵(数值已调整)
A = [2  4  6  8; 
     10 12 14 16];
B = [3  3  1  1; 
     1  1  3  3];

% 基础运算
C = A + B    % 矩阵加法
D = A - B    % 矩阵减法
E = A * B'   % 矩阵乘法(A × B的转置)

% 逐元素运算
F = A .* B   % 点乘(对应元素相乘)
H = A ./ B   % 点除(对应元素相除)

% 矩阵除法
G = A / B    % 矩阵右除(求解 G*B = A)
% 验证:G * B ≈ A

3 矩阵的下标

代码

A = magic(5);
disp(A) % 全部
disp(A(1, 2)); % 第1行,第2列
disp(A(2,:)); % 第2行,所有列
disp(A(:,4)); % 所有行,第4列

运行结果

17    24     1     8    15
23     5     7    14    16
4     6    13    20    22
10    12    19    21     3
11    18    25     2     9

24

23     5     7    14    16

8
14
20
21
2

代码

find(A > 20) % 找到所有比20大的值,并且返回是第几个(横着数,到头换到下一行)
[m, n] = find(A > 20) % 找到比20大的所有的值,并将下标存到[m, n]
[m, n] = find(A == 21) % 找到等于21的所有的值,并将下标存到[m, n]

结果

n是行,m是列

ans =

     2
     6
    15
    19
    23


m =

     2
     1
     5
     4
     3


n =

     1
     2
     3
     4
     5


m =

     4


n =

     4

四 流程控制

其实和C中的还是挺像的

1 if…else…end

  • 可以嵌套使用
  • else和elseif是可选的,if必须写的
if 条件表达式
    % 条件成立时执行的代码
elseif 其他条件
    % 备选条件代码
else
    % 所有条件不满足时的默认代码
end

2 for…end

  • 步长默认为1,可以省略
  • 起始值、步长、结束值可以是:正数、负数或小数
  • 循环变量会在每次迭代后自动更新
for 循环变量 = 起始值:步长:结束值
    执行语句
    ...
end

3 while…end

  • 在迭代前检查循环条件
  • 适合循环次数不确定的情况
  • 必须保证循环条件可以变为false,不然会死循环
while 循环条件
    % 循环体代码
end

4 switch…case…end

  • 比多个if else清晰得多
  • case值可以是 数值或字符串
  • otherwise 分支是可以去掉的
switch 表达式
    case1
        % 匹配值1的代码
    case ...
        % 联合处理代码
    ...
    otherwise
        % 默认执行代码 --> 如果表达式的值不与上面任何一个匹配才执行这个
end

5 例题

1)求 1^2 + 2^2 + … + 5^2

>> sum = 0;
for n = 1:5
    sum = sum + n^2;
end
disp(sum)

%% 答案    55

2)使用for循环求$$

\sum_{i=1}^{5} i!
$$ 的值

也就是1到5的阶乘之和

>> sum = 0;
for i = 1:5
    n = 1;
    for j = 1:i
        n = n * j;
    end
    sum = sum + n;
end
disp(sum)
%% 答案   153

3)求 1 + 2 + 3 + … + 10 的和

>> sum = 0;
n = 1;
while n <= 10
    sum = sum + n;
    n = n + 1;
end
disp(sum)
>> sum = 0;
for i = 1:10
    sum = sum + i;
end
disp(sum)

结果:55

……


网站公告

今日签到

点亮在社区的每一天
去签到