矩阵操作
生成矩阵
生成行矩阵的方式:
-
冒号表达式
x = 1:1:5 % 1 2 3 4 5
以步长为1,从1到5生成数值,构成行矩阵。
若不设置步长,则默认步长为1。
-
linspace(a, b, n)
linspace(1, 5, 5) % 1 2 3 4 5
从1到5生成5个数值,构成行矩阵。
从a到b生成n个数值,构成行矩阵。
若不设置n,则默认为100。
由矩阵生成矩阵
repmat函数
B = repmat(A, m, n):将矩阵A当作一个整体,水平复制m次,竖直复制n次,得到 m × n m×n m×n个A矩阵构成的矩阵,返回新矩阵。
B = repmat(A, [m, n]):用法同上,这种调用形式一般的用法为:C = repmat(A, size(B));
。
A = randi(10, 2, 3) % 产生[1, 10]的2×3的矩阵
B = repmat(A, 3, 2)
结果如下:
A =
9 4 1
7 10 5
B =
9 4 1 9 4 1
7 10 5 7 10 5
9 4 1 9 4 1
7 10 5 7 10 5
9 4 1 9 4 1
7 10 5 7 10 5
矩阵元素的引用方式
-
通过下标引用矩阵元素
A(3, 4)
获取矩阵A第三行第四列的元素。A(5, 7) = 2
将矩阵A第五行第七列的元素设置为2,若矩阵A之前大小不足五行七列,则对矩阵进行扩展,未赋值的元素被设置为0。 -
通过序号引用矩阵元素
列优先,从1开始。
序号与下标是一一对应的,以 m × n m×n m×n矩阵A为例,矩阵元素A(i, j)的序号为 ( j − 1 ) × m + i (j-1)×m+i (j−1)×m+i。
矩阵元素的序号和下标可以利用sub2ind和ind2sub函数相互转换。
-
sub2ind函数:将矩阵中指定元素的行、列下标转换成存储的序号。调用格式为:
D = sub2ind(S, I, J)
其中,
S
为一个由行数和列数构成的矩阵,I
为要进行转化的矩阵元素的行坐标构成的矩阵,也就是可以一次性转化多个矩阵元素的坐标,同样的,J
为要进行转化的矩阵元素的列坐标构成的矩阵,D
为对应的序号矩阵。显然,I
和J
必须是同型矩阵。A = [1:3;4:6] D = sub2ind(size(A), [1 2;2 2], [1 1;3 2])
结果如下:
A = 1 2 3 4 5 6 D = 1 2 6 4
size(A)
返回一个由矩阵A的行数和列数构成的行矩阵。 -
ind2sub函数:将把矩阵元素的序号转换成对应的下标,其调用格式为:
[I, J] = ind2sub(S, D)
字母含义与上面相同。
D
也同样可以是个矩阵,得到的I
和J
也是矩阵。[I J] = ind2sub([3 3], [1 3 5])
结果如下:
I = 1 3 2 J = 1 1 2
获取子矩阵
A (i, : ) | 第i行的全部元素 |
A ( : , j) | 第j列的全部元素 |
A( i : i+m , k : k+m ) | 第i~i+m行内且在第k~k+m列中的所有元素 |
A( i : i+m , : ) | 第i~i+m行的全部元素 |
end运算符:表示某一维的末尾元素下标。
A = reshape(1:20, [5, 4])'
A1 = A([1 4], 3:end)
A2 = A(end:-1:1, : )
结果如下:
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
A1 =
3 4 5
18 19 20
A2 =
16 17 18 19 20
11 12 13 14 15
6 7 8 9 10
1 2 3 4 5
reshape函数讲解
reshape函数是一个列优先函数,无论是从矩阵中取数还是向新矩阵中加数,都是按照列优先的原则进行的。
reshape函数的标准用法:reshape(A, [ROW, COL])
或reshape(A, ROW, COL)
,在矩阵总元素数目保持不变的前提下,将矩阵A转型成
R
O
W
×
C
O
L
ROW×COL
ROW×COL的矩阵,返回新矩阵。
如何理解"shape函数是个列优先函数"?
A = 1:6
A1 = reshape(A, [2, 3])
结果如下:
A =
1 2 3 4 5 6
A1 =
1 3 5
2 4 6
取A中序号为1的元素作为A1中序号为1的元素,取A中序号为2的元素作为A1中序号为2的元素,……,取A中序号为6的元素作为A1中序号为6的元素。这样就填满了新型矩阵A1,因为此函数是按元素的序号顺序对新矩阵进行的赋值,而元素编号的顺序是列优先的,所以此函数是列优先的函数。
该函数的本质只是改变原矩阵的行数和列数,但并不改变原矩阵的元素个数及其存储顺序。
另:可参考
对于上面为构造
4
×
5
4×5
4×5的按行递增的矩阵,必须要先构造
5
×
4
5×4
5×4的矩阵,再进行转置操作。其中,'
就是进行转置的操作。
A1矩阵是获取了A矩阵的第一行从第三列到第五列(即最后一列)的全部元素和第四行从第三列到第五列(即最后一列)的全部元素,这些元素的对应位置不变,但绝对位置发生改变,即用这些数填满一个新型矩阵。
A2矩阵可以理解为将A矩阵上下翻转。先取第四行(即最后一行)的全部元素,也就相当于把第四行的全部元素放在了A2矩阵的第一行,再取第三行的全部元素,也就相当于把第三行的全部元素放在了A2矩阵的第二行,……,从而实现了上下翻转的操作。注意将步长设置为-1,否则默认为1,而默认为1是无法实现从end减少到1的,因此会出现错误。这是一个比较特殊的用法或技巧。
删除子矩阵
通过对子矩阵赋值为空矩阵来实现删除子矩阵。
A = reshape(1:20, 5, 4)';
A([2 4], :) = []
结果如下:
A =
1 2 3 4 5
11 12 13 14 15
我们赋值的操作导致A矩阵失去了第二行和第四行的全部元素,新的A矩阵是一个 2 × 5 2×5 2×5的矩阵。
如果我们要是删除的子矩阵的A中不与A的第一行、最后一行、第一列和最后一列相交的子矩阵会成功吗,如果成功那么新矩阵又会是什么样子呢?
A = reshape(1:20, 5, 4)';
A(2:3, 2:4) = []
结果如下:
空赋值只能具有一个非冒号索引。 % ERROR!
我们得到了一个错误的警告,“空赋值只能具有一个非冒号索引”,这说明如果我们要想将子矩阵设置为空矩阵,则必须要是将一个由若干完整的列或若干完整的行构成的子矩阵,也就是非冒号索引最多一个。(你也可以理解为,只有这样要求,才能保证输出的是合法的矩阵,如果不这样要求,那你难道能想到输出是什么吗?)
冒号索引的特殊用法
B(:)
可以得到矩阵B的元素构成的列向量,依旧是列优先。
B = [1 2 3; 4 5 6; 7 8 9]
B(:)
结果如下:
B =
1 2 3
4 5 6
7 8 9
ans =
1
4
7
2
5
8
3
6
9
可以看出B(:)
等价于reshape(B, 6, 1)
将矩阵B转换为了六行一列。文章来源:https://www.toymoban.com/news/detail-409839.html
因此,对于任意的一个矩阵A,A(:)
等价于reshape(A, ROW×COL, 1)
。文章来源地址https://www.toymoban.com/news/detail-409839.html
到了这里,关于【Matlab】矩阵操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!