matlab矩阵以及常用函数 矩阵 矩阵除法 矩阵旋转 reshape函数 size函数 矩阵元素的操作 函数 常用函数 find函数

  • 调用函数文件的一般格式为 [输出参数表]=函数名(输入参数表)
  • 调用函数时应注意: 当调用一个函数时,输入和输出参数的顺序应与函数定义时的一致,其数目可以 按少于函数文件中所规定的输入和输出参数调用函数,但不能使用多于函数文件所规定的 输入和输出参数数目。如果输入和输出参数数目多于或少于函数文件所允许的数目,则调 用时自动返回错误信息。
  • 当函数有一个以上输出参数时,输出参数包含在方括号内。例如,[m,n]=size(x)。 注意:[m,n]在左边表示函数的两个输出参数 m 和 n;不要把它和[m,n]在等号右边的情况混 淆,如 y=[m,n]表示数组 y 由变量 m 和 n 所组成。

矩阵

  • 下标从1开始
  • 矩阵里面元素可以是符号与字符(‘a’,’,’),输入的元素维度要一样
    • 矩阵里面的元素也可以是矩阵,但是矩阵长度维度必须与其它元素相同
  • 生成10*10的矩阵可以如下:a = [1:10;11:20;21:....];就是运用:
  • 对矩阵a第一行后面2个赋予其他值(灵活运用:)
1
2
3
4
a = [1 2 3
4 7 8
1 2 5];
a(1,2:3) = x;
  • 对一个矩阵A赋值提取可以取出然后赋给一个小矩阵a
  • 矩阵的下标也可以是向量。
    • 例如 b=a(x,y);可以得到一个矩阵 b。a 的行标来自向量 x,而列标来自向量 y。 例如,矩阵 a 有 n 列,那末 b=a(:,n:-1:1) 将得到矩阵 b,它等于矩阵 a 按列的逆序排列。
  • a(end:-1:end-5, 3)是最后一行到倒数第6行的所有第三个元素

  • 删除矩阵某行某列a(i,j)=[];

  • 如果要将一个矩阵存储在计算机中,MATLAB 规定矩阵元素在存储器中的存放次序是 按列的先后顺序存放,即存完第 1 列后,再存第 2 列,依次类推
    • 作为矩阵的特例,一维数组或者说向量元素是依其元素本身的先后次序进行存储的。
    • 必须指出,不是所有高级语言都这样规定矩阵(或数组)元素的存储次序,例如 C 语言 就是按行的先后顺序来存放数组元素,即存完第 1 行后,再存第 2 行,依次类推。记住这 一点对正确使用高级语言的接口技术是十分有益的。
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    clc;
    clear;
    a=[2 5 6 9 8 86 4 5 6 65 3 54];
    m=a(1);
    for i=1:12
    if a(i)>m
    m=a(i);
    end
    end
    m

    a=[1,2,3,4,5,6,7];
    for i=1:7
    a(i)=a(i)+1;
    end

    clc,clear
    A=[0.5,1.732,0.618,3.1415,1.6,0.9];
    for i=1:6
    for j=i:6
    if a(j)<a(i)
    a(i)=a(i)+a(j);
    a(j)=a(i)-a(j);
    a(i)=a(i)-a(j);
    end
    end
    end


    clc,clear
    for i=1:15
    for j=1:15
    if i+j==15&&4*i+2*j==40
    fprintf(‘兔
    end
    end
    end

矩阵除法


  • 解线性方程组时,我们需要用到矩阵的除法。
    • a为系数矩阵,b为结果矩阵,x为解集矩阵。
    • 当遇到A*X=B时,两边左除A,X=AB。
    • 当遇到X*A=B时,两边右除A,X=B/A。
  • 如果我们需要矩阵A与B对应元素相除,依旧点除。

矩阵旋转

  • 对于函数rot90顺时针旋转90度,可以rot90(a,3);或者rot90(a,-1);
  • fliplr(A)左右旋转,就是最后2个字母l,r即left,right
  • flipud(A)上下旋转,就是最后2个字母u,d即up,down
  • B = fliplr(A) 返回 A,围绕垂直轴按左右方向翻转其各列。
    • 如果 A 是一个行向量,则 fliplr(A) 返回一个相同长度的向量,其元素的顺序颠倒。如果 A 是一个列向量,则 fliplr(A) 只返回 A。对于多维数组,fliplr 作用于由第一个和第二个维度构成的平面。
    • fliplr(A) 等效于 flip(A,2)

reshape函数

  • 按列优先

size函数

矩阵元素的操作

  • 取矩阵A的第i1~i2行、第j1~j2列构成新矩阵:A(i1:i2, j1:j2)
  • 以逆序提取矩阵A的第i1~i2行,构成新矩阵:A(i2:-1:i1,:)
  • 以逆序提取矩阵A的第j1~j2列,构成新矩阵:A(:, j2:-1:j1)
  • 删除A的第i1~i2行,构成新矩阵:A(i1:i2,:)=[ ]
  • 删除A的第j1~j2列,构成新矩阵:A(:, j1:j2)=[ ]
  • 将矩阵A和B拼接成新矩阵:[A B];%行连接[A;B]%列连接

按照matlab中列优先提取

  • 形如a(k)的都是单下标索引,按照列优先原则
  • 想提取出a的2、5两个元素,并放入新矩阵中,可以使用a( [ 2 5 ] ),

    • 2和5必须用[ ]括起来,否则像a(2 5)计算机是读不出来的。
  • 同理,提取a( [ 1 3 5 ] )是提取第1、3、5个矩阵并放入同一行,此时也可以使用a(1:2:5),因为冒号存在,没有[ ]计算机也知道它的意思。

  • 如果我要把第1、3个元素放入第一行,第2、4个元素放入第二行,可以a( [ 1 3;2 4 ] )

  • a( [1,2,3] )逗号,空格都用来分隔
  • 栗子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    clc,clear;
    close all;
    a = [1 2
    3 4
    5 6];
    a([1 2],[1 2]) %双下标索引
    a([1 2])
    a([1 3; 2 4])

    %answer
    %第一行与第二行和第一列与第二列相交的元素
    ans =

    1 2
    3 4


    ans =

    1 3


    ans =

    1 5
    3 2
  • a(:)代表提取a矩阵所有的元素,原理是排序法则(列优先)。

    • a( : , : )也是提取a矩阵所有的元素,与原矩阵相同

双下标索引

  • 若a是已知的矩阵,a( [ 1 3 ] , [ 2 4 ] )的意思是:把a第1、3行和第2、4行相交的元素,放入新矩阵中。并且位置和原来保持一致。

矩阵乘法

  • matlab 中.有什么区别简单的说:
    • *代表变量相乘,或者矩阵相乘
    • .* 是矩阵中对应位置变量相乘,组成新得矩阵
      • 例如
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        [1 2 3].*[3 4 6]=[3 8 18]
        但是[1 2 3] * [3 4 6]就是语法错误!
        另外[1 2; 3 4] .*[5 6;7 8]=[5 12;21 28]
        [1 2; 3 4]*[5 6;7 8]=[19 22;43 50]
        也就是说两个同维数的矩阵既可以点乘也可以矩阵相乘,只是结果不一样而已!
        *表示线性代数中矩阵相乘的概念!

        注意,
        在进行数与数之间的运算时“.*”和“*”是没有区别的,都是表示普通的乘法运算。例:m = 2,n = 4,m.*n = 8, m*n = 8
        在进行矩阵之间的运算时“.*”和“*”的意义就有所不同了。假设a,b表示两个矩阵,a*b表示矩阵a与矩阵b进行矩阵相乘,a.*b表示矩阵a中的元素与矩阵b中的元素按位置依次相乘,得到的结果将作为新矩阵中相同位置的元素。

函数

diag

  • 1. diag函数:sum(diag(a)+diag(a'))可以求矩阵a对角线上的元素之和,不过中间的一个元素会提取2次,diag(a')可以提取副对角线的元素(先将矩阵转置)

    • 当Random是向量时,才构成对角矩阵,当Random是m×n矩阵时,得到的是个向量。比如diag([1 3;2 4])得到向量,diag([1 3])得到2×2矩阵。
    • 可以用来访问对角元素
  • 当 v 是向量时,diag(v)得到以 v 的元素为主对角线上元素的对角矩阵;

  • 当 v 是矩阵时,diag(v)得到一个列向量,其元素为矩阵 v 主对角线上的元素, diag(v,1)得到矩阵 v 对角线上移一行的元素组成的列向量,diag(v,-1)得到矩阵 v 对 角线下移一行的元素组成的列向量。
    • diag(a)只是diag(a,0)的简写,diag提取出来的都是列矩阵
  • 详情查看help

max

matlab中的sort函数

  • 调用格式:
    • B = sort(A)
      • 如果 A 是向量,则 sort(A) 对向量元素进行排序。
      • 如果 A 是矩阵,则 sort(A) 会将 A 的列视为向量并对每列进行排序。
      • 如果 A 是多维数组,则 sort(A) 会沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。
    • B = sort(A,dim)返回 A 沿维度 dim 的排序元素。例如,如果 A 是一个矩阵,则 sort(A,2) 对每行中的元素进行排序。
    • B = sort(___,direction)使用上述任何语法返回按 direction 指定的顺序显示的 A 的有序元素。’ascend’ 表示升序(默认值),’descend’ 表示降序。
      • 排序方向必须为 ‘ascend’ 或 ‘descend’
    • B = sort(___,Name,Value)指定用于排序的其他参数。例如,sort(A,'ComparisonMethod','abs') 按模对 A 的元素进行排序。
    • [B,I] = sort(___)还会为上述任意语法返回一个索引向量的集合。I 的大小与 A 的大小相同,它描述了 A 的元素沿已排序的维度在 B 中的排列情况。例如,如果 A 是一个向量,则 B = A(I)。
      - I是B对应的在未排序的矩阵(向量)中的下标
      
  • sort(c)从小到大
  • sort(c, 'descend')逆序排列(从大到小).
  • 例题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A = [3 6 5; 7 -2 4; 1 0 -9]
    B = sort(A,2)
    A = 3×3

    3 6 5
    7 -2 4
    1 0 -9
    B = 3×3

    3 5 6
    -2 4 7
    -9 0 1
  • dim - 沿其运算的维度

    • 正整数标量
    • 沿其运算的维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
    • 假定有矩阵 A。sort(A,1) 对 A 的元素进行排序。
    • sort(A,2) 对 A 的元素进行排序。
  • 注意如果a = 123,此时sort(a)没有作用,因为a是一个数,一个变量,不是集合!!排不了。就像对15这个数一样,sort是对2个及其以上元素排序

  • sort(a,1)把矩阵的每一列分别从小到大排成新的矩阵。

  • sort(a,2)把矩阵的每一行分别从小到大排成新的矩阵。
  • sort(a)默认的是sort(a,1)
  • 矩阵a是行矩阵时,sort(a)不再是sort(a,1),而转换为了sort(a,2)

MATLAB判断一个数是否整数

1
2
3
4
5

if x==fix(x)
% x为整数
%fix(x)为取整
end

mod函数

  • b = mod(a,m)返回a除以m后的余数,其中a是被除数,m是除数。这个函数通常称为模运算,使用b = a - m.*floor(a /m)计算。mod函数遵循mod(a,0)返回a
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    %栗子1
    clc,clear;
    a = [-4 -1 7 9];
    m = 3;
    b = mod(a,m)
    a
    %answer
    b =
    2 2 1 0
    a =
    -4 -1 7 9

    %栗子2
    clc,clear;
    a = [1 2 3 4];
    m = 2;
    b = mod(a,m)
    c = ~mod(a,m) %转换为逻辑矩阵
    b =
    1 0 1 0
    c =
    0 1 0 1

常用函数

  • 取整
    • fix:向零取整
    • ceil:向上取整
    • floor:向下取整
    • round:四舍五入
  • 取余
    • rem:带符号
    • mod:不带符号
  • num2str,str2num,size,length
  • max等函数的参数是矩阵时,是作用在矩阵各列上

find函数

注意点以及搭配其它函数使用的小技巧

  • 要直接查找 X 中满足条件 X < 5 的元素,请使用 X(X < 5)。尽量避免使用 X(find( X < 5) ) 之类的函数调用,因为这种调用中对逻辑矩阵使用的 find 完全没有必要。

  • 将 find 与 X>1 之类的关系运算结合在一起执行时,必须记住关系运算的结果是由 1 和 0 组成的逻辑矩阵。例如,命令 [row,col,v] = find(X>1) 会返回由 v 的逻辑值 1 (true) 组成的列向量。

  • 假设矩阵为x,则最大值为max(max(x))。 所在位置为:[rows,cols]=find(x==max(max(x)))。蛮有用的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    clc,clear;
    x = [1 2
    3 4
    5 6];
    find(x < 5)
    [rows,cols]=find(x==max(max(x)))

    %answer
    ans =
    1
    2
    4
    5
    rows =
    3
    cols =
    2
  • len = length(find(X == k));是为了求得矩阵X中值为k的元素个数,等价于下面两种方法:

    • len = length(X(X==k));
    • B = X==k; len=sum(sum(B));
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      clc,clear;
      b = [1 2
      3 4
      5 6
      6 6];
      [r,c] = max(b)
      len1 = length(find(b == 6))
      len2 = length(b(b==6))
      a = b==6; len3=sum(sum(a))

      %answer
      r =
      6 6
      c =
      4 3
      len1 =
      3
      len2 =
      3
      len3 =
      3
  • [row,col,v] = find(X, ...)

    • 返回X中非零元素的一个列或行向量v,同时返回行和列的索引值。
    • 如果X是一个逻辑表示,则v是一个逻辑矩阵。
    • 输出向量v包含通过评估X表示得到的逻辑矩阵的非零元素。
      • 记住,当你用find指令处理一个逻辑表达的时候,输出向量v不包含输入矩阵的非零元素的索引值。而是包含评估逻辑表达之后返回的非零值。
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        clc,clear;
        A= magic(4)
        [r,c,v]= find(A>10);
        r
        c
        v
        %answer
        A =
        16 2 3 13
        5 11 10 8
        9 7 6 12
        4 14 15 1
        r =
        1
        2
        4
        4
        1
        3
        c =
        1
        2
        2
        3
        4
        4
        v =
        1
        1
        1
        1
        1
        1

栗子(有几种用法,注意一下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
X = [1 0 2; 0 1 1; 0 0 4]
%X = 3×3
1 0 2
0 1 1
0 0 4
k = find(X)
%k = 5×1
1
5
7
8
9

%对 X 使用逻辑 not 运算符以查找零值。
k2 = find(~X) %注意
k2 = 4×1

2
3
4
6


%在 4×4 幻方矩阵中查找前五个小于 10 的元素
X = magic(4)
%X = 4×4

16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

k = find(X<10,5) %注意可以用表达式!
%k = 5×1

2
3
4
5
7

%查看 X 的对应元素。
X(k)
%ans = 5×1

5
9
4
2
7


%要查找特定的整数值,请使用 == 运算符。例如,在 1×10 的奇整数向量中查找等于 13 的元素。
x = 1:2:20
%x = 1×10

1 3 5 7 9 11 13 15 17 19

k = find(x==13)
%k = 7



%要查找非整数值,请基于您的数据使用容差值。否则,由于浮点舍入误差有时会生成空矩阵。
y = 0:0.1:1
%y = 1×11
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000
k = find(y==0.3)
%k = 1x0 empty double row vector
%因为浮点数储存精度问题,跟c/c++类似
k = find(abs(y-0.3) < 0.001) %算法笔记也有类似
%k = 4


%在 4×4 矩阵中查找前 3 个大于 0 且小于 10 的元素。指定两个输出以便将行和列下标返回到这些元素。

X = [18 3 1 11; 8 10 11 3; 9 14 6 1; 4 3 15 21]
%X = 4×4

18 3 1 11
8 10 11 3
9 14 6 1
4 3 15 21

[row,col] = find(X>0 & X<10,3) %注意注意
%row = 3×1

2
3
4

%col = 3×1

1
1
1

%第一个实例是 X(2,1),即 8。


%在 3×3 矩阵中查找非零元素。指定三个输出以返回行下标、列下标和元素值。
X = [3 2 0; -5 0 7; 0 0 1]
%X = 3×3

3 2 0
-5 0 7
0 0 1

[row,col,v] = find(X)
%row = 5×1

1
2
1
2
3

%col = 5×1

1
1
2
3
3

%v = 5×1

3
-5
2
7
1