matlab学习笔记(2)-数组+矩阵

意义

简化标量重复运算,可结合线性代数理解

数组->矩阵

>> v3 = [1,2;3,4;5,6]
v3 =
     1     2
     3     4
     5     6

数组的创建

普通定义方法

%% 定义一个数组的不同方法
>> x1 = [1,2,3,4,5,6,7,8,9,10]; %用逗号隔开
>> x2 = [10 9 8 7 6 5 4 3 2 1]; %用空格隔开
>> x3 = 1:1:10; %(初始值,增加(可正可负),终止值)

linspace()函数


>> x4 = linspace(1,89,10)(起始值,终止值,元素个数);(平均分非常好)
>> x4 =
  1 至 8 列
    1.0000   10.7778   20.5556   30.3333   40.1111   49.8889   59.6667   69.4444
  9 至 10 列
   79.2222   89.0000
%%增量 = (末 - 初)/(元素数量-1)

logspace()函数:用于构造以十为底的指数

>> x3 = logspace(1,2,3)
x3 =
   10.0000   31.6228  100.0000

复数数组的创建

>> x5 = x1+i*x2; %复数的数组,因为用空格隔开元素,所以复数不可出现空格;
>> x5
x5 =
  1 至 4 列
   1.0000 +10.0000i   2.0000 + 9.0000i   3.0000 + 8.0000i   4.0000 + 7.0000i
  5 至 8 列
   5.0000 + 6.0000i   6.0000 + 5.0000i   7.0000 + 4.0000i   8.0000 + 3.0000i
  9 至 10 列
   9.0000 + 2.0000i  10.0000 + 1.0000i
>> 

数组编址

与c的区别,第一个元素对应编址 “1”,
可用如下方式访问数组元素:

>> x1(5)
ans =
     5
>> x1(1:2:10) %访问1到10的所有奇数
ans =
     1     3     5     7     9
>> x1(10:-2:3)
ans =
    10     8     6     4
>> x2([2,4,3,1]) %[2,4,3,1]本身也是一个数组,访问该数组对应的地址上的元素
ans =
     9     7     8    10

矩阵编址

>> v1(1,2) % 前为行后为列
ans =
     2

用数组以及数组编址来构建数组

>> y1 = x1(2:3);
>> y2 = x2(10:-1:6);
>> y3 = [y1,y2];
>> y3
y3 =
     2     3     1     2     3     4     5

数组方向

行向量与列向量

>> x1 = 1:10 %行向量
x1 =
     1     2     3     4     5     6     7     8     9    10
>> x2 = [1;2;3] %列向量
x2 =
     1
     2
     3

转置与点转置

>> x2' %列向量转置变成行向量
ans =
     1     2     3
% 复数的转置与点转置
>> x1 = x4([1:3])
x1 =
  1.0000 +10.0000i   2.0000 + 9.0000i   3.0000 + 8.0000i
>> x1'
ans =
  1.0000 -10.0000i
  2.0000 - 9.0000i
  3.0000 - 8.0000i
>> x1.'
ans =
  1.0000 +10.0000i
  2.0000 + 9.0000i
  3.0000 + 8.0000i

对于实数来说,‘ 与 .’ 是等价的

数组运算

标量-数组运算

标量与数组直接运算,遵循数学运算优先级,对数组相当于对元素直接运算

>> v3
v3 =
     1     2
     3     4
     5     6
>> v3 - 1
ans =
     0     1
     2     3
     4     5
>> v3*4 + 2
ans =
     6    10
    14    18
    22    26

数组-数组运算(矩阵相关运算)

加法:对应元素相加

v4 =
     2     3
     4     5
     6     7
>> v3 
v3 =
     1     2
     3     4
     5     6
>> v3 + v4 %对应元素相加
ans =
     3     5
     7     9
    11    13

矩阵乘法:点乘与矩阵乘法

>> v3 
v3 =
     1     2
     3     4
     5     6
>> v4
v4 =
     2     3
     4     5
     6     7
>> v3.*v4 %带点乘法,各元素相乘
ans =
     2     6
    12    20
    30    42
>> v5 = v4'% 转置,使前列等于后行
v5 =
     2     4     6
     3     5     7
>> v4*v5%矩阵乘法
ans =
    13    23    33
    23    41    59
    33    59    85
>> 

矩阵除法 1 == 乘于逆矩阵(左除与右除)

>> v2*pinv(v1) %pinv()求奇异矩阵或长方阵的逆
ans =
   -0.3333    0.3333
   -0.6667    0.6667
>> v2/v1
ans =
   -0.3333    0.3333
   -0.6667    0.6667
>> v1\v2
ans =
    0.0000    0.0000    0.0000
         0         0         0
    0.3333    0.3333    0.3333
>> v2\v1
警告: 秩亏,秩 = 1,tol =  1.489520e-15。 
 
ans =
    1.8000    2.4000    3.0000
         0         0         0
         0         0         0
>> 

求幂运算:

%必须带点.^n,不带点会报错
>> v1.^2
ans =
     1     4     9
    16    25    36

数组(矩阵)操作2

元素赋值

v1 =
     1     2     3
     4     5     6
>> v1(1,2) = 0 % 单独对第一行第二列元素进行赋值
v1 =
     1     0     3
     4     5     6
>> v1(1,:) = 1 % 对第一行全部元素进行赋值 1
v1 =
     1     1     1
     4     5     6
>> v1(:,1) = 2 % 对第一列全部元素进行赋值 2
v1 =
     2     1     1
     2     5     6

改变矩阵大小

%添加
>> v1(4,5) = 3 % 当行列不够时自动添加
v1 =
     2     1     1     0     0
     2     5     6     0     0
     0     0     0     0     0
     0     0     0     0     3
%删除
>> v1
v1 =
     2     5     6     0     0
     0     0     0     0     3
>> p
p =
     1     3
>> v1(:,p) = [] % 删除矩阵的第一三列
v1 =
     5     0     0
     0     0     3
>> 

排列子块

%% 逆序
>> v1(4:-1:1,1:5) %元素逆序 == v1(4:-1:1,:)" : "表示取所有
ans =
     0     0     0     0     3
     0     0     0     0     0
     2     5     6     0     0
     2     1     1     0     0
>> v1(4:-1:1,5:-1:1)
ans =
     3     0     0     0     0
     0     0     0     0     0
     0     0     6     5     2
     0     0     1     1     2

提取子块

% 提取子块,然后构造数组
>> q = [v1 v2(:,2:3)]
q =
     2     1     1     0     0     1     1
     2     5     6     0     0     2     2
     0     0     0     0     0     0     0
     0     0     0     0     3     0     0
>> p = [v1;v2(2:3,:)] % 一样用分号隔开列
p =
     2     1     1     0     0
     2     5     6     0     0
     0     0     0     0     0
     0     0     0     0     3
     2     2     2     0     0
     0     0     0     0     0
     
% 用数组索引提取子块
v1 =
     2     1     1     0     0
     2     5     6     0     0
     0     0     0     0     0
     0     0     0     0     3
>> p = [1,3] % 用p作索引
p =
     1     3
>> v1(p,p)
ans =
     2     1
     0     0
%依次提取每一列
>>o =
     1     3
     1     3
>> o(:)
ans =
     1
     1
     3
     3

总结

所有操作都离不开数组编址,不够自动补,删除可以用空序列

子序列查找

find()函数

%返回满足条件元素的行坐标列坐标
v1 =
     1     3
     1     3
>> find(v1>1)
ans =
     3
     4
>> [g,h] = find(v1>1)
g =%行数
     1
     2
h =%列数
     2
     2

用矩阵做索引,找出对应元素

>> X = find(v1>1)
X =
     3
     4
>> v1(X)
ans =
     3
     3

矩阵大小

whos函数,查看大小与类型

>> whos
  Name      Size            Bytes  Class     Attributes   
   v1        2x2                32  double
   v2        4x5               160  double 

size函数查看行列数

%返回行列数
>> size(v1)
ans =
     2     2
>> v1
v1 =
     1     3
     1     3
%返回行数
>> size(v1,1) % 返回第一个变量,为行数
ans =
     2

length()查看max(row,column)

>> length(v2)
ans =
     5
>> v2
v2 =
     1     1     1     0     0
     2     2     2     0     0
     0     0     0     0     0
     0     0     0     0     0

常见数组操作函数

函数 用途
flipud() 矩阵上下翻转
fliplr() 矩阵左右翻转
rot90() 矩阵逆时针旋转90度
reshape(x,m,n) 对矩阵的元素进行重新排列
diag(X) 提取矩阵X的对角元素,形成一个列向量
diag(v) 用该向量构成一个对角矩阵
tril(X) 提取矩阵的下三角矩阵
triu() 提取矩阵的上三角矩阵
circshift(x,m) 矩阵循环移位(最下一行移到最上面一行)

  1. 不是很清楚,代补充. ↩︎

  2. 结合前面的编址 ↩︎

发布了10 篇原创文章 · 获赞 10 · 访问量 3511

猜你喜欢

转载自blog.csdn.net/weixin_43746266/article/details/86749956