笔记 matlab 矩阵运算03

 内容均来自《MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)》MATLAB教程新手入门篇(上部分)(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili

  • 矩阵运算

1.常见函数

  • sum 求和函数

    • sum(A) A是一个向量时,可以计算A向量中所有元素的和。
    • sum(A,dim)   A是一个矩阵,可以计算A沿不同维度dim时所有元素的和。
      • sum(A,1)  可以简写为sum(A),沿着行方向,即计算每一列的和。
      • sum(A,2)  沿着列方向,即计算每一行的和。
%A是向量
A=1:100;
sum(A)  %1~100累加,5050

%A是矩阵
A = randi(10,3,4)
A = 3×4    
%     3     9     4     7
%     9     3     2     5
%     3    10     3     4

sum(A,1)  % 计算每一列的和,返回行向量;等价于sum(A),dim=1时可以不写  
%    15    22     9    16

sum(A,2)  % 计算每一行的和,返回列向量
ans = 3×1    
%   23
%   19
%   20
  • 计算一个矩阵中所有元素的总和:
    • sum(sum(A))    计算每一列的和,返回一个行向量,然后再计算这个行向量的和
    • sum(A(:))   把A按照线性索引拼接成一个向量,然后再求和

    • sum(A,'all')  matlab2018b后可以用

    • 新用法 :sum(a, [1, 2])   对数组  a  进行多维求和,会沿着数组  a  的第1维和第2维进行求和,而保留第3维不变。

      a = randi(10,3,4)
      % a = 3×4    
      %     5     6     7     5
      %     9     7     4     2
      %     3     1     1     2
      
      sum(a,"all")  % 双引号表示字符串
      sum(a,'all')  % 单引号表示字符向量
      sum(a,[1,2])
      sum(sum(a))
      sum(a(:))
      % 结果都是 52
  • 默认情况下,求和时含有NaN,那么最终会返回NaN;

  • 可以在最后加一个输入参数 'omitnan', 这样计算时就会忽略NaN。

    • sum(A, 'omitnan')   A可以为向量和矩阵。

    • sum(A, 2, 'omitnan')   A可以为向量和矩阵

  • prod  求乘积函数 

         用法与sum函数类似

% A是向量
v = [2,4,5,1,10];  
prod(v)  % 向量中所有元素的乘积 
% 400

v = 1:10; 
prod(v)  % 计算10的阶乘,可以直接写成 prod(1:10)
% 3628800

% A是矩阵
A = randi(10,3,4)  
%    8     6     4     4
%   10     5     2     6
%    2     1     8     2

prod(A) % 计算每列的乘积,也可以写成 prod(A,1)  
%  160    30    64    48
prod(A,2)  % 计算每行的乘积  
%  768
%  600
%   32


v = [2,4,NaN,1,10];  % 有NaN值
A = [5 3 -8   4
1 5 NaN 10; 
3 6 18  9];  % 矩阵中存在NaN值

prod(v)  
% NAN
prod(A)  % 计算每一列的乘积
% 15 90 -144 360

% 如果计算时忽略NaN值,可以在最后面加上'omitnan'参数
prod(v, 'omitnan')
% 80
prod(A, 'omitnan')
% 15 90 -144 360
prod(A, 2, 'omitnan')
 %      -480
 %        50
 %      2916
  • cumcum  计算累积和

        用法与sum类似

A = [1 5 3 4 -5 0 8];
cumsum(A)    %计算向量A的累加值
% 1 6 9 13 8 8 16

A = randi(10,3,4)  
%    9     2     4     2
%    2     3    10    10
%    3     5     5    10

cumsum(A)  % 或者写成cumsum(A,1),计算每一列的累积和    
%    9     2     4     2
%   11     5    14    12
%   14    10    19    22

cumsum(A,2)  % 计算每一行的累积和 
%    9    11    15    17
%    2     5    15    25
%    3     8    13    23


A = [5 3 -8   4
1 5 NaN 10; 
3 6 18  9];
cumsum(A)  % 计算每一列的累积和
%    5     3    -8     4
%    6     8   NaN    14
%    9    14   NaN    23

cumsum(A,'omitnan')    % 忽略NaN值计算每一列的累积和 
%    5     3    -8     4
%    6     8    -8    14
%    9    14    10    23

cumsum(A, 2)  % 计算每一行的累积和  
%     5     8     0     4
%    1     6   NaN   NaN
%    3     9    27    36

cumsum(A, 2, 'omitnan')    % 忽略NaN值计算每一行的累积和  
%    5     8     0     4
%    1     6     6    16
%    3     9    27    36
  • diff  计算差分

    • diff(A,n)      A是向量时,表示A的n阶差分,当n等于1时,可以直接写成diff(A)。
w = [60 65 66 70 68 72 64 70];
diff(w)  % 1阶差分, diff(w,1)
%5 1 4 -2 4 -8 6
diff(w,2)  % 2阶差分
%-4 3 -6 6 -12 14
diff(w,3)  % 3阶差分
%7 -9 12 -18 26
  • diff(A,n,dim)        A是矩阵时,表示沿A的维度dim方向上计算差分
    • 当dim=1时,沿着行方向计算,即得到每列的n阶差分;diff(A,n,1)也可以简写成diff(A,n)。
    • 当dim=2时    沿着列方向计算,即得到每行的n阶差分。
  • diff函数不支持使用'omitnan'参数来忽略向量或者矩阵中的NaN值。

    • diff(w, 'omitnan')         错误使用 diff 差分阶数 N 必须为正整数标量。

    • diff(w, 1, 'omitnan')     错误使用 diff 差分阶数 N 必须为正整数标量。

    • diff(w, 1, 2,'omitnan')   错误使用 diff 差分阶数 N 必须为正整数标量。

      A = randi(10,3,4)
      %     2     6     4     1
      %   10     1     9     2
      5   10     3     1     7
      
      % 计算每列的1阶差分
      diff(A)  % 也可写成diff(A,1)或diff(A,1,1)   
      %    8    -5     5     1
      %    0     2    -8     5
      
      % 计算每列的2阶差分
      diff(A,2) % 也可写成diff(A,2,1)    
      %   -8     7   -13     4
      
      % 计算每行的1阶差分
      diff(A,1,2)    
      %    4    -2    -3
      %   -9     8    -7
      %   -7    -2     6
      
      % 计算每行的2阶差分
      diff(A,2,2)
      %    -6    -1
      %   17   -15
      %    5     8
      
      w = [60 65 NaN 70 68 72 64 70];
      diff(w)    
      %    5   NaN   NaN    -2     4    -8     6
      diff(w, 'omitnan')   %错误使用 diff  差分阶数 N 必须为正整数标量。
      diff(w, 1, 'omitnan') %错误使用 diff  差分阶数 N 必须为正整数标量。
      diff(w, 1, 2,'omitnan') %错误使用 diff  差分阶数 N 必须为正整数标量。
  • mean  计算平均值

        用法与sum类似

y = [1 3 5 7 9];
mean(y)    % A是向量,则mean(A)可以计算向量A的平均值。
% 5
    
%A是矩阵,则mean(A,dim)可以计算A沿维度dim中所有元素的平均值。
A = randi(10,3,4)
%     8     6     2     4
%    7     3     7     7
%    5     8     2     8

mean(A)    %可以写成mean(A,1) ,当dim=1时沿着行方向计算,即得到每列的平均值;
%   6.6667    5.6667    3.6667    6.3333

mean(A,2)    %当dim=2时沿着列方向计算,即得到每行的平均值。   
%   5.0000
%   6.0000
%   5.7500


A = [5 3 -8   4
1 5 NaN 10; 
3 6 18  9];    %也可以在最后加一个输入参数: 'omitnan', 这样计算时会忽略NaN。
mean(A)
%   3.0000    4.6667       NaN    7.6667

mean(A,'omitnan')   % 也可以写成mean(A,1,'omitnan'),忽略NaN值计算每一列的平均值 %    3.0000    4.6667    5.0000    7.6667

mean(A,2)
%    1
%  NaN
%    9

mean(A, 2, 'omitnan')    % 忽略NaN值计算每一行的平均值
%   1.0000
%   5.3333
%   9.0000
  • median 计算中位数

        用法与mean类似

y = [6 80 1 5 100 20 1000];
median(y)    %计算向量y的中位数
% 20

A = [5 3 -8   4
1 5 NaN 10; 
3 6 18  9];
median(A)  % 计算每一列的中位数
% 3  5  NaN  9

% 忽略NaN计算每一列的中位数
median(A,'omitnan')    % 也可以写成median(A,1,'omitnan'),忽略NaN计算每一列的中位数
%   3     5     5     9

median(A, 2, 'omitnan')    % 忽略NaN计算每一行的中位数    
%   3.5000
%   5.0000
%   7.5000

median(A(:), 'omitnan')  % 整个矩阵的中位数
% 5

mode 计算众数

  • 众数是指一组数据中出现次数最多的数。一组数据可以有多个众数。
  • 计算向量A的众数,直接调用mode(A)会返回A中出现次数最多的值。

    • 如果有多个值以相同的次数出现,mode函数将返回其中最小的值。

  • A是一个矩阵

    • mode(A,1)或者mode(A)可以沿着行方向进行计算,得到每一列的众数;

    • mode(A,2)可以沿着列方向进行计算,得到每一行的众数,这里的1和2表示维度dim。

  • 使用mode函数计算众数时会自动忽略NaN值,我们不能额外添加'omitnan'参数,否则会报错
A = [2 3 -1 2 1 3];
mode(A)  % 2

A = randi(5,6,8);
% 2 1 3 4 5 4 4 1
% 3 5 5 4 5 1 4 1
% 3 4 3 2 4 4 5 4
% 1 3 3 2 1 1 5 3
% 2 3 2 5 2 4 2 3
% 5 2 3 1 2 3 4 5

mode(A)  
% 2 3 3 2 2 4 4 1

mode(A,2)
% 4 
% 5
% 4
% 1
% 2 
% 2

%使用mode函数计算众数时会自动忽略NaN值,我们不能额外添加'omitnan'参数,否则会报错。
A = [2 3 -1 NaN 1 NaN NaN 3];
mode(A) % 3
mode(A, 'omitnan') 
% 错误使用 mode
% 维度参数必须为正整数标量、由唯一正整数组成的向量或 'all'。
  • mode函数可以有多个返回值
    • [M,F] = mode(A),A是向量时,M表示向量A的众数,F表示众数M在向量A中出现的次数。
    • [M,F,C] = mode(A),M表示向量A的众数,F表示众数M在向量A中出现的次数,C是一个元胞数组,元胞数组里面有一个列向量,列向量中的每个元素都是向量A的众数。

      A = [-1 2 0 8 -1 0 2 1 8 0 8];
      [M, F] =mode(A)
      % M=0
      % F=3
      
      A = [-1 2 0 8 -1 0 2 1 8 0 8];
      [M, F, C] =mode(A)
      % M=0
      % F=3
      % C = 
      %   {2×1 double}
      
      C{1}
      % 0
      % 8
      
      A =  [3 3 1 4; 
           0 0 1 1;
           0 1 6 4;
           1 5 6 8];
      [M, F, C] = mode(A) % 计算每一列的众数
      % M = 1×4    第k列的众数
      %    0     0     1     4
      % F = 1×4    M中的各个众数在其所在列中出现的次数
      %    2     1     2     2
      % C=1X4cell    第k列的所有众数
      %     1    2               3        4
      %     0    [0;1;3;5]       [1;6]    4
      
      C{1}
      % 0
      C{2}
      % 0
      % 1
      % 3
      % 5
      C{2}
      % 1
      % 6
      C{4}
      % 4
      
      [M, F, C] = mode(A, 2)    % 计算每一行的众数   
      %    M=3
      %      0
      %      0
      %      1    
      %    F=2
      %      2
      %      1
      %      1
      %    C=4x1cell
      %     1    3
      %     2    [0;1]
      %     3    [0;1;4;6]
      %     4    [1;5;6;8]
      
      C{1}
      % 3
      C{2}
      % 0
      % 1
      C{3}
      % 0
      % 1
      % 4
      % 6
      C{4}
      % 1
      % 5
      % 6
      % 8
      
  • var 计算方差 

    •  A是向量,var(A,w),计算A的方差
      • w=0时,计算样本的方差(n-1);var(A,0)可以直接简写为var(A)
      • w=1时,计算总体方差(n)
    • A是矩阵,var(A,w,dim),计算矩阵A沿维度dim上的方差
      • dim = 1时表示沿着行方向进行计算,即得到每一列的方差;
      • dim = 2时表示沿着列 方向进行计算,即得到每一行的方差。
        • var(A, w, 1)可以简写为var(A,w);若w为0,则可以进一步简写为var(A)。

如果数据中存在NaN值,可以在var函数的最后加上'omitnan'参数来忽略NaN。

v = [6 8 10 12 14];  
var(v)  % 样本方差,等价于var(v,0)
% 10

var(v,1)  % 总体方差
% 8


A = randi(10,4,5)
%A = 4×5    
%    5    10     6     2     6
%    6     4     7    10     9
%   10     8     7     2     7
%    5     7     2     1     2

var(A)  % 每一列的样本方差  等价于var(A,0),var(A,0,1)
%    5.6667    6.2500    5.6667   17.5833    8.6667
var(A,0,2)  % 每一行的样本方差
%ans = 4×1    
%      8.2000
%      5.7000
%      8.7000
%      6.3000

A = [9  7    10  10  NaN;
10  NaN 10  5   10;
2   3    2   9   8;
10  6   10    2  10];  
% 矩阵中存在NaN值
var(A, 0, 2)  % 计算每一行的样本方差
%ans = 4×1    
%      NaN
%      NaN
%  11.7000
%  12.8000
% 忽略NaN值计算每一行的样本方差
var(A, 0, 2, 'omitnan')  
%ans = 4×1    
%   2.0000
%   6.2500
%  11.7000
%  12.8000
  • std  计算标准差

        用法与var相同

v = [6 8 10 12 14];  
std(v)  % 样本标准差,等价于std(v,0)
% 3.1623
std(v,1)  % 总体标准差
% 2.8284


% 下面看矩阵的例子
A = randi(10,4,5)
%A = 4×5    
%    9     7    10    10     5
%   10     1    10     5    10
%    2     3     2     9     8
%   10     6    10     2    10

std(A)  % 每一列的样本标准差,等价于std(A,0),std(A,0,1)
%ans = 1×5    
%  3.8622   2.7538    4.0000    3.6968    2.3629
std(A,0,2)  % 每一行的样本标准差
%ans = 4×1    
%   2.1679
%   4.0866
%   3.4205
%   3.5777


A = [9  7    10  10  NaN;
10  NaN 10  5   10;
2   3    2   9   8;
10  6   10    2  10];  
% 矩阵中存在NaN值
std(A, 0, 2)  % 计算每一行的样本标准差
%ans = 4×1    
%      NaN
%      NaN
%   3.4205
%   3.5777

% 忽略NaN值计算每一行的样本标准差
std(A, 0, 2, 'omitnan') 
%ans = 4×1    
%   1.4142
%   2.5000
%   3.4205
%   3.5777

  • min/max 求最小值/最大值

  •   以min函数为例,max函数用法相同
    • 1.求两个矩阵对应位置元素的最小值:  min(A,B) 

    • 矩阵A和矩阵B的大小可以不一样,只要保证矩阵A和矩阵B具有兼容的大小就能够计算

      A = randi(10,4,3)
      %A = 4×3    
      %     7    10     3
      %     2     3     1
      %     8     8     6
      %     3     2     7
      
      B = randi(10,4,3)
      %B = 4×3    
      %     6     7     8
      %     5     7     3
      %     7    10     2
      %     7     3     7
      
      min(A,B)
      %ans = 4×3    
      %     6     7     3
      %     2     3     1
      %     7     8     2
      %     3     2     7
      
      A = randi(10,4,3)
      %A = 4×3    
      %     5     4     9
      %     5     7     3
      %     7     5     7
      %     8     9     6
      
      B = 5;  % 例如B可以是一个标量(常数)
      min(A,B)
      %ans = 4×3    
      %     5     4     5
      %     5     5     3
      %     5     5     5
      %     5     5     5
      
      B = [4 5 6];
      min(A,B)
      %ans = 4×3    
      %     4     4     6
      %     4     5     3
      %     4     5     6
      %     4     5     6
      
    • 2.求向量或者矩阵中的最小值,可以指定沿什么维度计算并返回索引 
      • (1)如果A是向量,则min(A)返回A中的最小值。如果A中有复数,则比较的是复数的模长。

      • (2)如果A是矩阵,这里的1和2表示矩阵的维度(dim)。

        • min(A, [ ], 1)沿着A的行方向求每一列的最小值,也可以简写为min(A);

        • min(A, [ ], 2)沿着A的列方向求每一行的最小值。

        • 若不加空向量[ ] ,就是将A中每个元素和1或者2比较大小,并返回较小值。

          A = [5 6 7 3 5 3 10];
          min(A)
          % 3
          B = [4.5  3+4i  6];
          min(B) 
          % 4.5000
          
          A = randi(10,3,4)
          %A = 3×4    
          %     6     4     7     6
          %     9     2     5     7
          %     3    10     7     6
          min(A,[ ],1)  % 求每一列的最小值,可以简写成min(A)
          %ans = 1×4    
          %     3     2     5     6
          
          min(A,[ ],2)  % 求每一行的最小值
          %ans = 3×1    
          %     4
          %     2
          %     3
          
          min(A, 2)
          %ans = 3×4    
          %     2     2     2     2
          %     2     2     2     2
          %     2     2     2     2
          
      •  3.两个返回值 [m, ind] = min(A).
        • 第一个返回值m是我们要求的最小值
        • ind是最小值在所在维度上的索引
        • 如果最小元素出现多次,则 ind是最小值第一次出现位置的索引。
          
          %A是向量
          A = [5 6 7 3 5 3 10];
          [min_A , ind] = min(A)
          % min_A=3
          % ind=4
          
          % 矩阵的例子
          A = [ 7  9  2  8
          1  5  1  3
          6  5  8  2];
          [min_A , ind] = min(A,[ ],2)   % 求每一行的最小值并返回索引
          % min_A = 3×1    
          %     2
          %     1
          %     2
          %ind = 3×1    
          %     3
          %     1
          %     4
          [min_A , ind] = min(A)   % 求每一列的最小值并返回索引
          %min_A = 1×4    
          %     1     5     1     2
          %ind = 1×4    
          %     2     2     2     3
          %求出整个矩阵的最小值
          A = randi(100,3,4)
          %A = 3×4    
          %    73    22     7    37
          %    53    11    41    77
          %   100    11    45    63
          min(A(:))
          % 7
      •  如果向量或者矩阵中存在NaN值,min函数会自动忽略,不需要单独对NaN值进行处理。
  • % 存在缺失值的例子
    A = [5 6 7 NaN 5 3 10];
    [min_A , ind] = min(A)
    % min_A=3
    % ind=6
    
    % 求x和y对应元素的最小值
    x = [1  NaN  3   5   2  NaN  1];
    y = [2   5   4  NaN  2  NaN  9];
    min(x, y)
    %ans = 1×7    
    %     1     5     3     5     2   NaN     1
    
    % 求两个矩阵对应位置元素的最小值时,min函数只能有一个返回值!
    [min_xy, ind] = min(x, y)
    %错误使用 min
    %不支持具有两个要比较的矩阵和两个输出参数的 MIN。
  • mink 求前k个最小值

    • (1)如果A是一个向量,则mink(A,k)可以计算向量A的前k个最小值。
    • (2)如果A是一个矩阵,则mink(A,k,dim)可以计算A沿维度dim的前k个最小值。
      • 当dim=1时沿着行方向计算,即得到每列的前k个最小值;dim=1时,mink(A,k,1)也可以简写成mink(A,k).
      • 当dim=2时沿着列方向计算,即得到每行的前k个最小值。
      • A = [1,5,0,4,9,9,3,5,8];
        mink(A,3)
        %ans = 1×3    
        %     0     1     3
        
        A = randi(10,5,4)
        %A = 5×4    
        %     7     6     5     7
        %     8     3     7     8
        %     6     1     4     5
        %     4     8     8     1
        %     2     3     4     4
        mink(A,3)  % 沿着行方向,等价于mink(A,3,1)
        %ans = 3×4    
        %     2     1     4     1
        %     4     3     4     4
        %     6     3     5     5
        mink(A,3,2)  %沿着列方向
        %ans = 5×3    
        %     5     6     7
        %     3     7     8
        %     1     4     5
        %     1     4     8
        %     2     3     4
        
        %老版本的MATLAB
        %向量的前k个最小值
        %可以先排序,再取出前k个元素。
        sortA = sort(A);
        sortA(1:3)
        %ans = 1×3    
        %     0     1     3
        %矩阵的前k个最小值
        sortA = sort(A);
        sortA(1:3,:) %沿着行方向
        %ans = 3×4    
        %     2     1     4     1
        %     4     3     4     4
        %     6     3     5     5
        
        sortA = sort(A,2);
        sortA(:,1:3) %沿着列方向
  • maxk 求前k个最大值

        用法与mink相同

  • topkrows 返回矩阵按照排序顺序的前若干行

    • B=topkrows(X,k)  返回按降序(对于数值数据)或字母顺序倒序(对于文本数据)排序的数组X的前k行。
      • topkrows 基于第一列中的元素进行排序。当第一列包含值相等的元素时topkrows 将根据下一列中的元素进行排序,并对后续的相等值重复此行为,最后返回排序的前k行。
    • B=topkrows(X,k,col)按col指定的列对结果进行排序。使用此语法可连续执行多列排序。
      • 例如,topkrows(X,k,5)基于第五列中的元素按降序对X的行进行排序。
      • topkrows(X,k,[4 6])首先基于第四列中的元素按降序对行进行排序,然后基于第六列中的元素进一步排序。
    • B=topkrows(,direction)使用上述任何语法指定排序方向。
      • direction 可以是ascend'、'descend'或包含这两个值的元胞数组。
    • 例如,topkrows(A,2,[2 3]).{'ascend''descend'”)首先基于第 2列的元素按升序对行进行排序从而获得前 2 行。然后基于第 3列中的元素,对第2列中具有相等条目的行按降序排序。
      x = randi(10,10,4);
      topkrows(x,3) 
      %等价于
      sx = sortrows(x,'descend');
      sx(1:3,:)
      
      topkrows(x,4,2)  
      %等价于
      sx = sortrows(x,2,'descend');
      sx(1:4,:)
      
      topkrows(x,3,[2,4],'ascend') % 升序
      %等价于
      sx = sortrows(x,[2,4]);
      sx(1:3,:)
      
      topkrows(x,4,[3,2],{'ascend','descend'})
      %等价于
      sx = sortrows(x,[3,2],{'ascend','descend'});
      sx(1:4,:)

2.算术运算

  • 矩阵加法、减法

  • MATLAB中,只要两个矩阵的大小兼容,就能够进行计算
  • 以下是一些具有兼容大小的标量、向量和矩阵的组合:
    • 两个大小完全相同的输入。
    • 一个输入是标量。
    • 一个输入是矩阵,另一个输入是具有相同行数的列向量。
    • 一个输入是矩阵,另一个输入是具有相同列数的行向量。
    • 一个输入是列向量,另一个输入是行向量。
  • 执行运算时,MATLAB会将大小兼容的矩阵隐式扩展为相同的大小,然后再将对应位置的元素进行运算,这种计算方式在MATLAB中称为“按对应位置的元素运算”

    • A = randi(10,2,3)
      B = randi(10,2,3)
      A + B
      A - B
      
      A = randi(10,2,3)
      B = randi(10,1)
      A + B
      A - B
      
      A = randi(10,2,3)
      B = randi(10,2,1)
      A + B
      A - B
      
      A = randi(10,2,3)
      B = randi(10,1,3)
      A + B
      A - B
      
      A = randi(10,2,1)
      B = randi(10,1,3)
      A + B
      A - B
  • 矩阵乘法

    • 线性代数中定义的矩阵的乘法,使用的运算符号是乘号“*”,必须要满足前面矩阵A的列数和后面矩阵B的行数相等;

    • 按对应位置的元素运算”的乘法,使用的运算符号是点乘 “.*”,这时A和B的大小只需要满足上方表格介绍的五种兼容模式。

  • 如果一个矩阵和常数相乘,那么使用乘号“*”和点乘“.*”得到的结果相同。
  • A = randi(10,2,3)
    % 4 2 3
    % 6 7 7
    B = randi(10,3,1)    
    %    7
    %    8
    %    5
    A * B
    % 59
    % 133
    
    A = randi(10,2,3)  
    %    10     5    10
    %    1     2     1
    B = randi(10,2,3)    
    %    8     9     4
    %    9     1     3
    A .* B
    % 80 45 40
    % 9 2 3
    
    x = randi(10,5)
    % 6	 6	2	10	4
    % 2	 5	3	5	2
    % 9	 1	5	5	8
    % 7	 3	1	4	4
    % 4	 2	10	10	3
    y = 3;
    x * y 
    x.* y
    %18	 18	6	30	12
    %6	 15	9	15	6
    %27	 3	15	15	24
    %21	 9	3	12	12
    %12	 6	30	30	9
  • 矩阵除法

    • 右除  x = B/A 表示对线性方程组x*A = B求解x
    • 左除  x = B\A 表示对线性方程组A*x = B求解x
    • 点除  即将两个矩阵按对应位置的元素做除法

      • A ./ B”表示用A的每个元素除以B的对应元素,A和B的大小必须兼容;

      • 命令“A .\ B”则表示用B的每个元素除以A的对应元素

      • 特别地,如果B是标量,那么A./B的结果和A/B的结果相同。

A = [2,8,2;
     5,-4,8;
     6,4,0];
B = [18,60,-6];
x = B / A   % [5 -2 3]
% 验算下:x*A是否等于B
x * A
% 18 60 -6

A = [1 5 8;
     2,4,9;
     3,0,2];
B = [10;
     4;
     -1];
x = A\B  % [1;5;-2]
% 验算下:A*x是否等于B
A * x
%    10
%    4
5   -1

A = randi([0,10],3,2)
% 4	10
% 1	10
% 1	6
B = randi([0,10],3,2)
% 0	9
% 2	0
% 3	0
A ./ B  % 点右除
% Inf	1.1111
% 0.5000	Inf
% 0.3333	Inf
1 ./ A  % 对A中每个元素计算倒数
% 0.2500	0.1000
% 1.0000	0.1000
% 1.0000	0.1667
  • 矩阵乘方 

    • “^”表示矩阵的幂运算,例如A是一个方阵,那么A ^ 3等价于A*A*A;       

    • “.^”表示对矩阵中的每一个元素分别进行乘方计算,例如A .^ 0.5表示对矩阵A中的每一个元素开根号

      A = randi([0,10],2,2)
      % 7  4
      % 2  6
      A ^ 3 % 等价于A * A * A
      % 503  540
      % 270  368
      
      
      A = randi(10,3,4)
      %    8     8     5     6
      %    1     5     4     9
      %   10     5     6     8
      A .^ 2  % 每个元素求平方,等价于 A .* A
      %    64    64    25    36
      %    1    25    16    81
      %  100    25    36    64
      A .^ 0.5   % 每个元素开根号,等价于sqrt(A)
      %   2.8284    2.8284    2.2361    2.4495
      %   1.0000    2.2361    2.0000    3.0000
      %   3.1623    2.2361    2.4495    2.8284
      A .^ (-1)   % 每个元素求倒数,等价于 1./ A 
      %    0.1250    0.1250    0.2000    0.1667
      %    1.0000    0.2000    0.2500    0.1111
      %    0.1000    0.2000    0.1667    0.1250
      
  • 矩阵的逆

    • 只有方阵才有逆矩阵的概念

    • A^(-1)  或 inv(A)

      A = [1 2 3;
          2 2 1;
          3 4 3]
      B1 = A ^ (-1)
      B2 = inv(A)
      % B1 = 
      %    1.0000    3.0000   -2.0000
      %   -1.5000   -3.0000    2.5000
      %    1.0000    1.0000   -1.0000
      
      % B2 = 
      %    1.0000    3.0000   -2.0000
      %   -1.5000   -3.0000    2.5000
      %    1.0000    1.0000   -1.0000
      
    • 根据线性代数中逆矩阵的定义,互为逆矩阵的两个矩阵的乘积为单位矩阵(主对角线为1,其余位置为0的方阵)

      • 理想情况下,B1*A将生成单位矩阵。但由于 MATLAB使用浮点数计算矩阵的逆存在一定的误差,因此,实际上 B1*A接近但不完全等于单位矩阵。

        format long g
        B1*A
        % ans = 
        %                         1      1.77635683940025e-15                         0
        %     -8.88178419700125e-16                         1     -8.88178419700125e-16
        %      4.44089209850063e-16                         0                         1
        format short     %理想情况下,B1*A将生成单位矩阵。
  •  矩阵转置

    • 矩阵的转置符号为英文的单引号:“ ’ ”,转置的同时将复数变为共轭复数。

    • 也可以在前面加上点变成“ .’ ”,转置的同时复数将保留原来的复数。

  • 通常情况若矩阵中全是实数,那么使用“’”和“.’”的效果相同
format short
A = [ 3     1+3i;
      2     5;
      4-2i  6];
A'
% ans = 
%   3.0000 + 0.0000i   2.0000 + 0.0000i   4.0000 + 2.0000i
%   1.0000 - 3.0000i   5.0000 + 0.0000i   6.0000 + 0.0000i
A.'
% ans = 
%   3.0000 + 0.0000i   2.0000 + 0.0000i   4.0000 - 2.0000i
%   1.0000 + 3.0000i   5.0000 + 0.0000i   6.0000 + 0.0000i
  • 练习

    • 用来评价预测效果好坏的一些指标 (详细解释在code3_4_2中)
      • 假设真实值是向量y, 拟合值或预测值是向量y_hat

        • SSE 误差(或残差)平方和,范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。量纲是原来数据量纲的平方。

        • MSE 均方误差(Mean Square Error),范围[0,+∞),就是SSE除了一个n。当预测值与真实值完全吻合时等于0。误差越大,该值越大。量纲是原来数据量纲的平方。

        • RMSE: 均方根误差(Root Mean Square Error),范围[0,+∞),就是MSE加了个根号。当预测值与真实值完全吻合时等于0。误差越大,该值越大。量纲是原来数据量纲的平方。

        • MAE: 平均绝对误差(Mean Absolute Error)范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。它的量纲和原来数据的量纲相同。

        • MAPE: 平均绝对百分比误差(Mean Absolute Percentage Error)该公式通常将值乘以100,以百分比形式表示数字。范围[0,+∞),当预测值与真实值完全吻合时等于0。

          • 当真实值有数据等于0时,存在分母为0的问题,该公式不可用!

          • 将这个数乘以100,那么它的单位为%

        • SMAPE:对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)它的范围是0%到200%,当预测值与真实值完全吻合时等于0。
          • 有些地方定义的SMAPE的分母没有加绝对值,这时候SMAPE可能为负数。

          • 将这个数乘以100,那么它的单位为%

        • R平方:决定系数、可决系数、R方、拟合优度(Coefficient of determination)
          • 注意:如果使用的是线性回归模型,那么两种计算R方的公式都可以使用,且此时R方的范围是[0,1]

          • 如果使用的是非线性回归模型,那么R方使用的是第一种定义方法!且此时R方的范围是负无穷到1。

  • y = [100 102 108 117 135 178 198 241 290 349];
    y_hat = [93 108 118 117 141 170 196 249 296 359];
    
    SSE = sum( (y-y_hat).^2 )
    
    n = length(y);
    MSE = 1/n*(sum( (y-y_hat).^2 ))
    
    RMSE = sqrt( 1/n*(sum((y-y_hat).^2)) )
    
    MAE = mean(abs(y-y_hat) )
    MAE = 1/n*( sum( abs(y-y_hat) ) )
    
    fz = y-y_hat;  % 分子
    MAPE = mean(abs(fz ./ y))
    MAPE = 1/n*(sum(abs(fz ./ y)))
    % 将这个数乘以100,那么它的单位为%
    MAPE = 1/n*(sum(abs(fz ./ y))) * 100
    
    fz = abs(y-y_hat)  % 分子
    fm = (abs(y)+abs(y_hat))/2  % 分母
    SMAPE = 1/n*(sum(fz./ fm ))
    
    %R平方
    y = [100 102 108 117 135 178 198 241 290 349];
    y_hat = [93 108 118 117 141 170 196 249 296 359];
    % 使用第1种方法计算
    fz = sum((y - y_hat).^2); % 分子
    mean(y)
    fm = sum((y - mean(y)).^2); % 分母 
    R2 = 1 - fz/fm  
    
    % 使用第2种方法计算
    fz = sum((y_hat - mean(y)).^2); % 分子
    fm = sum((y - mean(y)).^2); % 分母 
    R2 = fz/fm  
  •  优化算法中常见的测试函数
    • Sphere函数

    • Rastrigin函数

    • Griewank函数

    • Rosenbrock函数

      % Sphere函数 
      x = 1:10
      y = sum(x.^2) 
      
      % Rastrigin函数
      y = sum(x.^2-10*cos(2*pi*x)+10) %乘号不能省略
      
      % Griewank函数
      n = length(x);
      y = 1/4000*sum(x.*x)-prod(cos(x./sqrt(1:n))) + 1
      
      % Rosenbrock函数
      x = 1:10;
      tem1 = x(1:end-1)
      tem2 = x(2:end)
      y = sum(100 * (tem2-tem1.^2).^2 + (tem1-1).^2)

3.关系运算        

  • 6个关系运算符

  • 关系运算符可以用来比较两个数组中元素的关系,如果结果为真,则MATLAB会返回逻辑值1;如果结果为假,则会返回逻辑值0。 
  • == 等于
    • 一个等号是赋值,两个连续的等号才是判断是否相等

  • ~=不等于
  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于
  • NaN(不定值或缺失值)相互之间不相等

    A = 5;
    B = 4;  % 一个等号是给变量赋值,两个等号才是判断是否相等的关系运算符
    A == B  % ans = logical 0
    
    
    A = randi(5) % 生成[1,5]上的一个随机整数 A=5
    B = randi(5,2,3)
    % B = 2×3    
    %     5     5     1
    %     1     4     2
    
    A == B  
    % ans = 2×3 logical 数组    
    %   1   1   0
    %   0   0   0
    
    A = NaN;
    B = NaN;
    A == B  % ans = logical 0
    
  •  易错点:连续使用关系运算符
    0 == 0 == 0   % 返回 logical 0 (false)
    1 == 1 == 1   % 返回 logical 1 (true)
    -1 < 0 < 1   % 返回 logical 0 (false)
    1 > 0 > -1   % 返回 logical 1 (true)
  •  逻辑值1和逻辑值0在进行计算时也可以被视为数值1和数值0
    x = randi(10, 3, 4)
    %x = 3×4    
    %     7     4     8     1
    %     8     7     1     1
    %     8     2     3     9
    
    y = x > 5 % 也可以写成y = (x>5),加括号会让运算的顺序更清晰
    %y = 3×4 logical 数组    
    %   1   0   1   0
    %   1   1   0   0
    %   1   0   0   1
    
    sum(y)  % 计算每一列的和
    %ans = 1×4    
    %     3     1     1     1
    
    sum(y(:))  % 计算所有元素的和
    % ans = 6
  • 练习
    % 模拟投硬币10万次,计算出现正面的次数和频率
    n = 1e5;                % 科学计数法表示100000
    x = randi([0,1], n, 1); % 0表示正面,1表示反面,生成n行1列的矩阵
    s = sum(x == 0)         % 出现正面的次数
    pl = s / n              % 出现正面的频率
  •  判断浮点数是否相等

    • 解决方法:使用容差 tol(而不是使用 ==)比较浮点数。

      C = 0.5-0.4-0.1   % C = -2.7756e-17
      C == 0            % ans = 0
      C                 % C = -2.7756e-17
      % 解决方法:使用容差 tol(而不是使用 ==)比较浮点数。
      abs(C-0) <= 1e-12 % ans = 1
      

4.逻辑运算

  • 逻辑运算符

  • 逻辑与     and    &               and(1,1)=1&1   
  • 逻辑或     or       |                or(1,1)=1 |1    
  • 逻辑非     not     ~               not(1)=~1       
  • 逻辑异或  xor    没有相应的运算符     xor(1,0)
  • MATLAB会将非零数值视为逻辑1,将数值零视为逻辑0——MATLAB在进行逻辑运算之前,在计算机内部自动将数值转换成了逻辑值

    A = [-5 1.2  0  0  3  5.9];
    B = [0   4   1  0 1.5 -2 ];
    A & B    %   0   1   0   0   1   1
    
    A = randi([-5,5],4,3)
    %A = 4×3    
    %     3     1     5
    %     4    -4     5
    %    -4    -2    -4
    %     5     1     5
    
    logical(A)
    %ans = 4×3 logical 数组    
    %   1   1   1
    %   1   1   1
    %   1   1   1
    %   1   1   1
    
    A = randi([-3,3],2,4)
    %A = 2×4    
    %     3     2    -1     2
    %     0    -3     3     3
    
    B = randi([-3,3],1,4)
    %B = 1×4    
    %     1    -3     2     3
    
    B | 0
    %ans = 1×4 logical 数组    
    %   1   1   1   1
    
    A | B
    %ans = 2×4 logical 数组    
    %   1   1   1   1
    %   1   1   1   1
    
    ~A
    %ans = 2×4 logical 数组    
    %   0   0   0   0
    %   1   0   0   0
    
    xor(3,4)  % 0
    xor(A,B)
    %ans = 2×4 logical 数组    
    %   0   0   0   0
    %   1   0   0   0
    
  •  true函数和false函数可分别用来生成全为逻辑1和逻辑0的逻辑矩阵。
    true(2)  % 等价于logical(ones(2))
    %ans = 2×2 logical 数组    
    %   1   1
    %   1   1
    
    false(2,3)  % 等价于logical(zeros(2,3))
    %ans = 2×3 logical 数组    
    %   0   0   0
    %   0   0   0
    
  • 如果数据中存在NaN值,执行逻辑运算会报错 
  • 如果数据中存在复数,执行逻辑运算也会报错

    a = [0 1 nan 1];
    b = [0 1 1 1];
    a & b
    a | b
    ~a
    or(a,b)
    %错误使用  & 
    %NaN 值无法转换为逻辑值。
    
    a = 1+3i;
    b = 1;
    a & b
    a | b
    ~a
    xor(a,b)
    %错误使用  & 
    %NaN 值无法转换为逻辑值。
  • 另外,逻辑与& 和 逻辑或| 可以进行连续运算:
    • 使用小括号来指定计算的先后顺序! 这样会清晰很多。 
      1 & 2 & 3 % 1
      0 | 2 | 0 % 1
      A = randi([-3,3],2,4)
      % A = 2×4    
      %      1     2     1     1
      %      2    -1    -2    -3
      
      B = randi([-3,3],1,4)
      % B = 1×4    
      %     -2    -3    -3     2
      
      C = randi([-3,3],1,4)
      % C = 1×4    
      %      1    -1     3    -3
      
      A & B & C
      % ans = 2×4 logical 数组    
      %    1   1   1   1
      %    1   1   1   1
      
      A | B | C
      % ans = 2×4 logical 数组    
      %    1   1   1   1
      %    1   1   1   1
      
      A & B | C
      % ans = 2×4 logical 数组    
      %    1   1   1   1
      %    1   1   1   1
      
      A & (B | C) % 使用小括号修改先后顺序
      % ans = 2×4 logical 数组    
      %    1   1   1   1
      %    1   1   1   1
      
      % & 运算符的优先级高于 | 运算符
      2|0 &0   % 等价于2|(0&0) ,返回1
      (2|0)&0  % 返回0
      
      
      %区间[60,80)的表示
      D = (A >= 60) & (A < 80)  %不能写成 60 <= A < 80
      D = ((A >= 60) & (A < 80))
      
      %区间[0,60)U[80,100]的表示
      (A < 60) | (A >= 80)  
      ~D
  • &&和|| 

    • (1)&&和||只能对标量(只有一个值)进行逻辑运算,不能对有多个元素的向量或者矩阵进行运算,而&和|可以。

    • (2)&&和||进行逻辑运算时具有短路功能,可以提高运行效率:

      • 计算A && B时,如果A为逻辑0,则B不会被判断,因为最后的结果一定是逻辑0;
      • 计算A || B时,如果A为逻辑1,则B不会被判断,因为最后的结果一定是逻辑1。
        a = 10; 
        b = 2;
        (a+b < 10) & (a/b > 1) % 0
        (a+b < 10) && (a/b > 1) % 0
        
        (10 > 3) | logical(NaN)  %运行到logical(NaN)会报错
        (10 > 3) || logical(NaN) % 1,||有短路功能
  • 利用逻辑值对矩阵进行索引 

    • 利用逻辑索引提取矩阵指定位置的元素,可以生成一个和A同样大小的逻辑矩阵L,L中的元素要么是逻辑值1,要么是逻辑值0,其中,等于逻辑值1的元素所处的位置是我们所需要的。接着使用命令A(L),就能够在A中提取出指定位置的元素。

    • 矩阵的数据在计算机的内存中被存储为单列,由矩阵的各列顺次连接而成。因此这里返回的结果是根据L中等于1的位置按照各列顺次连接的。

      A = randi(10,3,4)
      %A = 3×4    
      %     8     7     6     3
      %     3     9     2     9
      %     6    10     2     3
      L = (A <= 5)
      %L = 3×4 logical 数组    
      %   0   0   0   1
      %   1   0   1   0
      %   0   0   1   1
      A(L)  %也可以写做A(A<=5)
      %ans = 5×1    
      %     3
      %     2
      %     2
      %     3
      %     3
      

    • 使用逻辑值修改或删除矩阵元素
      v = randi(10,1,6)
      %v = 1×6    
      %     9     4     3     5     2     7
      
      v(v > 6) = 100  % 将v中大于6的元素全部修改成100
      %v = 1×6    
      %   100     4     3     5     2   100
      
      v(v <= 5) = [ ]  % 删除v中小于等于5的元素
      %v = 1×2    
      %   100   100
      
      A = [1:4; 2:5; 3:6]
      %A = 3×4    
      %     1     2     3     4
      %     2     3     4     5
      %     3     4     5     6
      
      A(mod(A,3) == 0) = 10   % 将能被3整除的元素修改成10
      %A = 3×4    
      %     1     2    10     4
      %     2    10     4     5
      %    10     4     5    10
      
      A(A < 3) = 0  % 将小于3的元素修改成0
      %A = 3×4    
      %     0     0    10     4
      %     0    10     4     5
      %    10     4     5    10
      
      A(A <= 4 ) = [ ]  % 删除小于等于4的元素
      %A = 1×6    
      %    10    10    10     5     5    10
      
    • 判断矩阵里是否含有NaN,返回一个和输入的数组大小相同的逻辑值
    • 在MATLAB中,NaN相互之间不相等,运行NaN == NaN会返回逻辑0

      A = [10 NaN 5 2 NaN 8 5];
      isnan(A)
      %ans = 1×7 logical 数组    
      %   0   1   0   0   1   0   0
      
      ~(isnan(A))
      %ans = 1×7 logical 数组    
      %   1   0   1   1   0   1   1
      
       NaN == NaN % 0
       A == NaN % 0 0 0 0 0 0 0
  • all,any,find函数

    • all:判断数组元素是否全为非零值(可指定dim),全为非零值返回逻辑1,否则返回逻辑0
    • any:判断数组元素中是否存在至少1个非零值(可指定dim),是的话返回逻辑1,否则返回逻辑0
    • find:查找数组中的非零元素,并返回其索引
      • k=find(x)返回一个包含数组x中每个非零元素的线性索引的向量
      • k=find(x,n)返回与x中的非零元素对应的前n索引
      • k=find(x,n,direction)(其中direction为last)查找与x中的非零元素对应的最后n个索引。direction的默认值为first,则为查找与非零元素对应的前n个索引
      • [row,col]=find(x) 返回数组中非零元素的行和列下标
      • [row,col,v]​​​=find(x) 返回数组中非零元素的行和列下标,还返回包含x的非零元素的向量v​​​​
        • A = randi([-3,3],3,4)
          %A = 3×4    
          %    -3     3    -2    -1
          %     0    -1     3     1
          %    -1     3     1     1
          
          all(A)  % all(A,1)
          %ans = 
          %   0   1   1   1
          
          all(A,2)
          %ans = 
          %   1
          %   0
          %   1
          
          A = [0  0  -1  2;
              -3  0  1  -2;
              0  0  0  0];
          any(A)  % all(A,1)
          %ans = 
          %   1   0   1   1
          
          any(A,2)
          %ans = 
          %   1
          %   1
          %   0
          
          %判断整个矩阵的元素是否全部为非零值
          all(A(:)) % 0
          all(all(A)) % 0
          
          A = [4 0 11 -3 0 2 -4];
          ind = find(A) % 1 3 4 6 7
          [r, c] = find(A)
          % r=1 1 1 1 1
          % c=1 3 4 6 7
          
          A = [0 -1 0 0;
               4 0 0 3;
               0 1 0 0];
          ind = find(A, 2) % 2 4
          ind = find(A, 2, 'last') % 6 11
          [row,col] = find(A) 
          [row,col,v] = find(A)
          %row=
          %    2
          %    1 
          %    3 
          %    2
          %col=
          %    1
          %    2
          %    2
          %    4
          %v=
          %    4
          %    -1
          %    1
          %    3

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值