概述
本次的内容有点多,划一下重点:
size 函数:创建矩阵和确定循环结构的循环次数
reshape 函数:重新排列矩阵
sort 函数:内置的 sort 函数比自己编写的排序更高效
[] 中括号运算符:串联矩阵最重要的步骤
repmat 函数:重复矩阵的拼接
索引:功能强大,针对性的选取数组元素
矩阵的属性
复习一下之前介绍过的 MATLAB 命令:(>> whos)。
功能为显示所有变量的属性。有时候我们需要根据矩阵的属性来做一些操作就需要用到矩阵的一些相关属性。常用的属性都可以通过函数来调用:size,length,isrow,numel 等。
size
size 函数返回矩阵的各个维度的长度,调用方法为:sz = size(A)
命令行输入
1 | % size () |
命令行输出
1 | S = |
length
length函数返回矩阵的最长维度的长度,调用方法为:L = length(A)
命令行输入
1 | % length () |
命令行输出
1 | S = |
isrow
isrow如其名,作用就是询问矩阵是不是行向量。
同样作用的还有 iscolumn 确定矩阵是不是列向量,isempty 确定矩阵是不是为空
命令行输入
1 | % isrow () |
命令行输出
1 | S1 = |
numel
numel 函数返回数组元素的数量。
命令行输入
1 | A = zeros(3,4); % 创建一个 1×4 的矩阵,观察以下几个值 |
命令行输出
1 | n = |
矩阵的排列
矩阵的另一类操作是排列,对矩阵内的元素的相对位置重新处理,(很抽象的描述,还是看看函数的功能比较容易)。常见的的函数有 reshape,sort,flip,circshift 等
reshape
reshape 函数顾名思义就是对矩阵重排。
命令行输入
1 | A = magic(4) % 创建一个 4×4 的矩阵,观察以下几个值 |
命令行输出
1 | % reshape 之前 |
sort
对矩阵进行排序,默认升序(从小到大)
命令行输入
1 | A1 = [ 23 5 -1 4 7 0] |
命令行输出
1 | A1 = |
flip
flip 就是反转矩阵的元素
命令行输入
1 | A1 = [3 7 6 -1 0] |
命令行输出
1 | A1 = |
circshift
循环移位:所有元素向后移位,超出的部分自动补回到最前面
命令行输入
1 | A1 = [3 7 6 -1 0 2 8 0 ] |
命令行输出
1 | A1 = |
拼接矩阵
拼接矩阵是另一类创建矩阵的特殊手段,需要对矩阵元素直接的关系有足够的理解。我们先介绍([]),再介绍类似于 repmat,cat,repelem 的函数用法。
[] 符号
我们将左右中括号用于创建矩阵,我们其实就是将若干个数用中括号实现了元素和矩阵的拼接。
命令行输入
1 | a = [1,2] |
命令行输出
1 | a = |
repmat
创建重复矩阵组成的拼接矩阵
命令行输入
1 | A = [1,0;0,-1] |
命令行输出
1 | A = |
cat
cat 函数是中括号的函数形式,唯一不同的地方是 cat 函数可以连接三维矩阵
命令行输入
1 | A = [1, 2;3, 4] |
命令行输出
1 | A = |
repelem
复写矩阵里的元素
命令行输入
1 | A1 = [ 1 2 3] |
命令行输出
1 | A1 = |
索引
前面讲了那么多,终于可以讲最重要的索引部分。索引是什么?索引相当于编号,我们可以利用索引精确地找到我们想要的元素。无论是操作的输入还是输出,都要利用索引来实现。
1 | A1 = [9 8 7 6 5 4 3 2 1] |
将以上命令输入至命令行,将得到以下输出:
1 | A1 = |
补充内容
本次的内容有点多,重点内容需要巩固:
size函数:目前来说最常见用于创建矩阵和确定循环结构的循环次数。
1
2
3
4
5
6
7
8
9
10
11%% 1.模仿大师——创建一个一样大小的矩阵
a = [1 2 3 5;3 4 6 7];
b = zeros(size(a)); % 这就创建了一个大小完全一致的全零矩阵
% 试想如果 a 是外部输入的长度不确定的变量,这种方法就很高效
%% 2.循环次数
x = -1 : 0.1 : 3;
y = x;
for index = 1:size(x,2)
y(index) = (x(index)-1) * (x(index)-2) + index;
end
plot(x,y,'r--','LineWidth',3); % 曲线绘图函数reshape函数:重新排列矩阵,快速处理数据的手段
1
2
3
4
5
6
7A = 1:15;
% 这样可以按列创建顺序的矩阵
B1 = reshape(A,3,5)
% 这样可以按行创建顺序的矩阵
B2 = reshape(A,5,3)'
% 三维数组为未尝不可
B3 = reshape(A,5,1,3)sort函数:内置的sort函数比自己编写的排序更高效
1
2
3
4
5
6
7x = [ 8 9 2 4 0 10 3 6 7 1];
y = x.*x;
plot(x,y,'r*-');
% 点还是那些点,但顺序不对会影响绘图质量
% 这时排序可以用上
[x1,index] = sort(x);
plot(x1,y(index),'r*-');[ ]运算符:串联矩阵最重要的步骤
1
2
3
4
5
6
7% 绘制斐波那契数列的曲线
x = 1:15;
y = [1,1];
for index = 3:size(x,2)
y = [y y(end)+ y(end-1)];
end
plot(x,y,'ro-','LineWidth',3); % 曲线绘图函数repmat函数:重复矩阵的拼接
1
2
3% 字符串也可以拼接
a = ['hello']
b = repmat(a,3,2)索引:功能强大,针对性的选取数组元素
1 | % 仍使用sort的案例 |
思考
每一行代码执行后,对应变量会有什么变化?
1 | a = 2:3:8; |
解答:
1 | a是一个 1×3 的矩阵 [ 2 5 8 ] |
总结
本次的内容最大的重点是索引,结合逻辑矩阵能编写高效而简洁的代码。