3.1 MATLAB数组

3.1.1 创建数组

  • 函数 size() eg sz=size(A),将返回一个n维向量,其中包含数组每一维的大小。
  • 函数length() 返回数组的最大维数值

使用 “ ;”或者另起一行表明一行的结束,如 A = [2,5,7;1,2,43]。

  • 函数 zeros(m,n) 与函数 ones(m,n)
  • 函数 rand(m,n) 与函数 randn(m,n) 分别产生填充值为0到1的随机数的数组
  • 函数 diag()具有多种形式,最常见的是 diag(A),其中 A 为一数组,它将A中对角线上的元素作为向量返回;diag(V),其中V是一个向量,返回一条对角线为V的方阵。
  • 函数 magic() 它产生一个填充 1 到 m^2 之间数字的数组,其组织方式使得每一行、每一列以及对角线上的元素分别加起来等于相同的数。
    在这里插入图片描述

3.1.2 数组操作

3.1.2.1 获取数组中的元素

● 获取数组中的元素: 可以通过将需要获取元素的索引值用括号括起来的方 式对数组中的元素进行寻址,其中第一个值为行索引值,第二个值为列索引值。

>>A=magic(4);
>>A(4,1);
>>A(2,3)=0;

在这里插入图片描述
在这里插入图片描述

如果在超出数组范围的位置写入,Matlab将自动对数组进行扩充。
如果在数组当前元素的位置和将要写入新数值的位置之间缺失数据
的话,将对缺失数据填充为0.

在这里插入图片描述

3.1.2.2 各类型数组操作
1 数组算术操作

在这里插入图片描述

2 数组逻辑运算

若两个数组的维数相同或者其中一个是标量, 对于两个数组中单个元素的逻辑操作就可以执行, 结果将是与原数组具有相同大小取布尔值的数组.

A=[1 2;4 3]; B=[0 6;3 2]; B>=A
ans= 0 1
0 0

A>=4 >>C=[1 2 3 4];
ans= 0 0 >> A>C
0 0 Error using >
Matrix dimensions must agree.

3 使用库函数

在这里插入图片描述
在这里插入图片描述

4 数组连接

在这里插入图片描述

5 数组切片
	将数组中的一部分移入另一个数组中:             
	   B(<rangeBR>,<rangeBC>)=A(<rangeAR>,<rangeAC>);
每一切片数组的每一维数必须相等,或者A中切片大小为1×1;
如果执行这一语句之前B不存在的话,其中没有被显式赋值的位置将填充为0;
如果执行这一语句之前B存在的话,没有直接赋值的部分的值保持不变;

在这里插入图片描述

6 数组重排

● 对一种维数形式的数组重排为另外一种维数形式:
reshape(A,rows,cols,…)
Remark: reshape()并不会补充数据填充到空白位置,
数组A原始维数的乘积必须与新数组维数的乘积相等。

A=1:10; % 1*10
reshape(A,4,3) %%%error using reshape
reshape([A 0 0],4,3)
ans=
1 5 9
2 6 10
3 7 0
4 8 0

7 线性化数组

存储数组的内存块也是顺序排放的,数组按照列的顺序存放在内存中。
在这里插入图片描述

代码清单3-1 数组操作脚本

A = [2 5 7 3 ; 1 3 4 2]
[rows , cols] = size ( A )
odds = 1:2:cols
disp(‘odd columns of A using predefined indices’)
A(:,odds)
disp(‘odd columns of A using anonymous indices’)
A(end,1:2:end)
disp(‘put evens into odd values in a new array’)
B(:,odds)=A(:,2:2:end)
disp(‘set the even values in B to 99’)
B(1,2:2:end)=99
disp(‘find the small values in A’)
small=A<4
disp(‘add 10 to the small values’)
A(small) = A(small) + 10
disp(‘the can be done in one ugly operation’)
A(A<4) = A(A<4) + 10
small_index = find(small)
A(small_index) = A(small_index) + 100

3.2 MATLAB向量

3.2.1 创建向量

● 一、使用一系列长治来创建向量;

     (1)直接输入           
     (2)使用冒号输入某个范围内的数值              
               a : b : c (起始值:增量:结束值)      
     (3)linspace(a,b,c)             
               a: 起始值,b:终值, c:向量长度 (元素个数)                      
     (4)使用函数创建向量如zeros(),ones(), rand()

● 二、通过对已有向量进行操作产生新向量;

 ●	Remarks: 
       利用MATLAB窗口中的workspace查看变量,
      workspace给出的变量信息包括:
                         变量名、变量值、变量类型
      利用MATLAB命令窗口中的who,whos命令查看变量

3.2.2 向量尺寸

3.2.3 向量索引

1 数值索引
2 逻辑索引

3.2.4 缩短向量

3.2.5 向量操作

1 算术操作
  当两向量长度相同或者其中之一为标量时,算术操作可以在
  两向量中的每一个元素上共同执行。
   A+B
   A-B
   A.*B
   A./B
   A.^a
2 逻辑操作
 当两个向量长度相同或者其中之一为标量时,可以在两向量中执行逐个元素的逻辑是操作,
 结果将是与原始向量长度相同的且取逻辑值的向量。
A=[2 5 7 3 1];  B=[0 6 5 3 2];
A>=5; A>=B;  C=[1 2 3];
A>C %%不能运算

可以使用逻辑“与”和“或”操作将逻辑操作符组合称复杂的操作:
  &、|:对具有匹配尺寸的逻辑数组的单个逻辑值进行逐元素
             的匹配执行;
  &&、||:将单个逻辑结果结合起来;
 	  A=[true true false false]; B=[true false true false];
		 A&B ;   A|B;
	  C=[1 0 0]; A&C  %%显示出错

●	注: 如果要得到对应逻辑向量中元素为真的向量元素索引值, 
		函数find()可以完成此项任务, 它需要输入一个逻辑值数组,
		 然后输出取真值的元素所对应位置的向量. 
●	例:>> A=[2 5 7 1 3];  A>4;
        >> a=find(A>4)
             a= 2    3
       >> A(a)
         ans=
                5  7

3 应用库函数

  • sum(V)/mean(V): 向量所有元素之和/均值;
  • min(V)/max(V): 返回向量V的最小/最大值以及该值在向量中出现的位置;
  • round(V), ceil(V), floor(V), fix(V): 将向量中所有数值中的小数部分去掉, 分别对应常规的舍入、向上舍入、向下舍入、向零舍入;
    • round:向最近的方向取整(四舍五入)
    • ceil: 向正无穷大方向取整(向上舍入)
    • floor: 向负无穷大方向取整(向下舍入)
    • fix: 向零方向取整(向零舍入)
      在这里插入图片描述

4 连接

A=[B,C,D,…,X,Y,Z]
  A=[2 5 7];
  B=[1 3 5];
  [A,B]
  [A, 5,B]

5 切片

切片(将一个向量中的一部分移入另外一个向量的一部分中)

B(<rangeB>)=A(<rangeA>)
  rangeB的大小必须与rangeA大小相同或者rangeA的大小为1;
 若执行此语句之前B不存在,其中没有被显式赋值的位置将自动用0填充;
  若执行此语句之前B存在,没有直接在rangeB范围内赋值的部分其值保持不变

代码清单 3-2 向量索引脚本

clear
clc %%清理前面的输出
A = [2,5,7,1,3,4];%%创建一个具有5个元素的向量A
odds = 1:2:length(A);%%读取向量A中奇数位置的数
disp(‘odd values of A using predifined indices’)
A(odds)%%读取向量A中奇数位置的数
disp(‘odd values of A using anonymous indices’)
A(1:2:end)%%读取向量A中奇数位置的数
disp(‘put evens into odd values in a new array’)
B(odds)=A(2:2:end)%%读取向量A偶数位置的数,其他无法读取的数用0代替。
disp(‘set the even values in B to 99’)
B(2:2:end)=99%%读取向量A偶数位置的数用99代替。
disp(‘find the small values in A’)
small=A<4%%逻辑语句 找到A中比4小的数并输出1,否则输出0
disp(‘add 10 to the small values’)
A(small) = A(small) + 10%%比4小的项+10
disp(‘the can be done in one ugly operation’)
A(A<4) = A(A<4) + 10%比4小的项+10

在这里插入图片描述

课后习题

##此代码为matlab中代码
%%    chapter 3

%%    代码清单 31  数组操作脚本

clear    %%清理变量
clc      %%清理前面的输出
A = [2 5 7 3 ; 1 3 4 2]    %%创建一个具有2*4的矩阵A
[rows , cols] = size ( A )    %%得到行数和列数
odds = 1:2:cols    %%创建向量odds,它包含了奇数列的索引值

%%disp()函数可以在command窗口中显示内容
disp('odd columns of A using predefined indices')
A(:,odds)    %%取出A中的奇数列
disp('odd columns of A using anonymous indices')
A(end,1:2:end)    %%上一行命令的匿名实现
disp('put evens into odd values in a new array')
B(:,odds)=A(:,2:2:end)    %%将B中没有被赋值的元素填充为0
disp('set the even values in B to 99')
B(1,2:2:end)=99    %%将B中选中位置的元素赋值为99
disp('find the small values in A')
small=A<4    %%逻辑语句 找到A中比4小的数并输出1,否则输出0
disp('add 10 to the small values')
A(small) = A(small) + 10    %%4小的项+10
disp('the can be done in one ugly operation')
A(A<4) = A(A<4) + 10    %%4小的项+10
small_index = find(small)    %%运用函数find() 返回原数组线性化形式下索引值的列向量。
A(small_index) = A(small_index) + 100    %%%%4小的项(前面已经找出对应位置)+100




%%    代码清单 32  向量索引脚本

clear    %%清理变量
clc    %%清理前面的输出
A = [2,5,7,1,3,4];    %%创建一个具有5个元素的向量A
odds = 1:2:length(A);    %%读取向量A中奇数位置的数
%%disp()函数可以在command窗口中显示内容
disp('odd values of A using predifined indices')
A(odds)    %%读取向量A中奇数位置的数
disp('odd values of A using anonymous indices')
A(1:2:end)    %%读取向量A中奇数位置的数(上面两行命令的匿名显示方式)
disp('put evens into odd values in a new array')
B(odds)=A(2:2:end)    %%读取向量A偶数位置的数,其他无法读取的数用0代替。
disp('set the even values in B to 99')
B(2:2:end)=99    %%读取向量A偶数位置的数用99代替。
disp('find the small values in A')
small=A<4    %%逻辑语句 找到A中比4小的数并输出1,否则输出0
disp('add 10 to the small values')
A(small) = A(small) + 10    %%4小的项+10
disp('the can be done in one ugly operation')
A(A<4) = A(A<4) + 10    %4小的项+10



%%    chapter 3    课后习题代码

%%    1    求y值为多少
x = [ 9 3 0 6 3]
y = mod((sqrt(length(((x+5).*[1 2 3 4 5]))*5)),3)   %% x中每个元素+5.*对应元素 求出其元素个数 除以三的余数

%%    2    向量操作
vec=[4,5,2,8,4,7,2,64,2,57,2,45,7,43,2,5,7,3,3,6253,3,4,3,0,-65,-343]
%%    (1)    创建一个新的向量 vecR 使其为vec的转置
vecR=vec'    %%求vec的转置
%%    (2)    使vecB成为vec中的前半部分与后半部分互换的结果
a=length(vec);
vecB=[vec(a/2+1:a),vec(1:a/2)]
%%    (3)    vecS使其包含小于45的元素
b=find(vec<45);
vecS=vec(b)
%%    (4)    vec3S从vec中最后一个元素开始,并且间隔三个元素取一个元素,直到第一个为止
vecR=vec(end:-4:1)
%%    (5)    vecN中包含所有等于2/4的元素
vecN=find(vec==2|vec==4)
%%    (6)    vecG包含vec中去掉索引值为奇数且取值为2/4的元素后所有元素
c=vec(2:2:end);
vecG=c(find(c~=2&c~=4))

%%    3    向量操作
nums1=[7,1,3,5,32,12,1,99,10,24];
nums2=[54,1,456,9,20,45,48,72,61,32,10,94,11];
nums3=[44,11,25,41,84,77,998,85,2,3,15];
%%    new_nums1、new_nums2、new_nums3,分别包含以上三个向量中从第一个元素开始且间隔取值的元素
new_nums1 = nums1(1:2:end)
new_nums2 = nums2(1:2:end)
new_nums3 = nums3(1:2:end)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐