1. matlab入门——数组

1、向量

(1)生成方式1:

  x = [值]

x = [3 5 6 7 8]  % 行向量
y = [4;5;6;7]  % 列向量
y = x'  % 行向量转为列向量

(2)生成方式2:

  x = 初始值:[步长]:终值

  x = 初始值:终值 (默认步长是1)

x = 5:2:20 
x = 3:15

(3)生成方式3:

  x = linspace(初值,终值,个数n)   步长 = (终值-初值)/ n

  x = linspace(初值,终值)     生成100个,均匀分布

x = linspace(4,12,5) % 生成5个
y = linspace(1,10)  % 默认生成100个

(4)生成方式4:

   x = logspace(初值,终值,个数)    生成[10^初值,10^终值]之间的数

  个数省略,默认50个

 x = logspace(1,2,10)  % 10到100之间10个数,均匀分布
 y = logspace(1,2)  % 1到100之间50个数

2、二维数组

(1)直接创建  

  空格逗号 区分同一行的不同元素;分号 或者 回车 区分不同行的元素。

(2)函数创建

  ① ones(n):生成n行n列,里面都是1;  ones(n,m)生成n行m列

  ② zeros(n):生成n行n列,里面都是0; zeros(n,m)生成n行m列

  ③ eye(n):生成n行n列,主对角线是1,其他均为0; eye(n,m)生成n行m列

  ④ rand(n) :生成n行n列随机数,分布在(0~1)之间;rand(n,m)生成n行m列

  ⑤ randn(n,m) :生成n行n列标准正态分布的伪随机数,均值为0,方差为1;

  ⑥ randi(max,n) :生成n行n列整数,数组分布在闭区间[1,max];

    randi(max,n,m) 指定最大值,生成n行m列 ;

    randi([iMin,iMax],n)指定最小和最大值;生成n行n列;

    randi([iMin,iMax],n,m)指定最小和最大值,生成n行m列 ;

 %% 二维数组1 直接创建
 x = [1 2 3;4 5 6]  % 分号换行
 y = [1 2 3         % 回车换行
     4 5 6
     7 8 9]
 %% 二维数组2 函数创建
 x = ones(9)
 y = ones(3,5)
 x = zeros(5)
 y = zeros(3,4)
 x = eye(9)
 y = eye(4,7)
 x = rand(5)
 y = rand(6,7)
 r = randn(5,6)
 r = randi(7,5)
 r = randi(5,6,7) % 6行7列,最大随机数5
 r = randi([5,10],5) % 最小5,最大10,5行5列
 r = randi([5,10],3,5) % 最小5,最大10,3行5列

3、数组大小

(1)d = size(数组名)  返回值为一个行向量

(2)[m,n] = size(数组名)   返回 m是行的尺寸大小,n是列的尺寸大小

 %% 数组大小1
 x = randi(7,4,6)
 d = size(x)    % 4 6
 [m,n] = size(x) % 分别返回 m=4 n=6

(3)length(数组名)

    空——>返回0;

    标量——>返回1;

    向量——>返回实际个数;

    多维数组——>返回较大维度。

 %% 数组大小2
 x = [3 4 5; 6 7 8; 6 8 9]
 y = [1 3 5 7 9]
 a = length(x) % 3 最大维度
 b = length(y) % 5 实际个数

(4) numel函数:返回数组总的个数,n*m

 %% 数组大小3
 x = ones(4,5)
 a = numel(x)  % 20  总的个数

4、数组的索引

(1)双下标索引

  方法:数组名(所在行,所在列)

(2)单下标索引

  方法:数组名(所在序号) 列优先排序

(3)双下标转为单下标索引

  方法:单下标索引 = sub2ind(size,m,n) (size数组大小=size(数组名))

(4)单下标转为双下标索引

  方法:[行,列] = ind2sub(数组大小,单下标索引)

 %% 数组的索引
 x = magic(6) % 生成一个魔方数组(每行的值相加相等)
 a = x(3,4)  % 获取位于数组3行4列的值
 
 b = x(4) % 获取第4列第一个数
 
 c = sub2ind(size(x),3,4)  % 21  位于3行4列的单下标索引为21
 
 [m,n] = ind2sub(size(x),21)  % m=3 ,n=4
  

【索引扩展】直接指定当前数组外的一个位置,并对其进行赋值。确保数组以最小代价完成扩展。

 

 %% 索引扩展
 a = zeros(3,3);
 a(2,4) = 9; % 现在的a是3行4列
 a(5,8) = 5; % 现在的a是5行8列

5、数组扩展

(1)cat函数

  方法:扩展结果 = cat(标识,数组1,数组2,...)     

  标识:1或2  1表示列组合(列一致)    2表示行组合(行一致)

(2)vercat函数

  方法:扩展结果 = vertcat(数组1,数组2,...)   垂直拓展

(3)horzcat函数

  方法:扩展结果 = horzcat(数组1,数组2,...)水平拓展

 %% 数组扩展
 a = ones(3,4);
 b = zeros(2,4);
 b1 = zeros(3,5);
 c = cat(1,a,b); % 列组合
 
 d = vertcat(a,b); % 列组合
 
 e = horzcat(a,b1); % 行组合

6、块操作

(1)repmat函数:重复数组

  方法:数组B = repmat(数组A,m,n) 把数组A变成m行n列个,赋给数组B

 % repmat函数
 A = [1 2 3; 4 5 6]; % 2行3列
 B = repmat(A,3,4);  % 6行12列
 C = repmat(A,2);  % 4行6列

(2)blkdiag函数:对角线拼接数组

  方法:数组D = blkdiag(数组A,数组B,数组C,...)

 % blkdiag函数
 A = magic(3);
 B = magic(4);
 C = blkdiag(A,B);  % 7行7列,对角线拼接

(3)kron函数:将数组A的元素每一个乘以数组B为一个块,最优所有的块是数组A的行列数

  方法:数组C = kron(数组A,数组B)

 % kron函数
 A = [0 1; 2 3];  % 2行2列
 B = [1 1 1;1 1 1;1 1 1]; % 3行3列
 C = kron(A,B)

 

7、数组裁剪

(1)罗列序号裁剪:直接将需要保留的序号罗列出来

  剪裁结果 = 原数组(保留的行,保留的列)

 % 罗列序号裁剪
 a = magic(6);
 b =a([2,3,4],[3,5]); % 保留原数组的2,3,4行和3,5列

(2)冒号区间裁剪:

  m:n    m—初始值,n—终止值

 % 冒号区间剪裁
 c = a(1:2,3:5); % 保留原数组的第1行到第2行与第3列到第5列交叉的值

(3)冒号等差序列:

  m:k:n   m—初始值,k—等差值,n—终止值

 % 冒号等差序列
 d = a(1:2:5,2:2:6); % 保留原数组第1行,第3行,第5行与第2列,第4列,第6列交叉的值

(4)冒号全部:

 % 冒号全部
 e = a(3:5,:); % 第3行到第5行的所有列

(5)删除整行整列:

  数组(要删除的行,:)= [ ]

  数组(:,要删除的列)= [ ]

 % 删除整行整列
 x = [1 2 3; 4 5 6; 7 8 9; 3 6 8; 3 6 8; 1 4 7];
 x(2:4,:) = []  % 删除2,3,4行
 x(:,2:3) = []  % 删除2,3列

8、数组转置

(1)实数

  操作符:'  或者 .'

  函数: transpose  或  ctranspose

 % 实数
 a = magic(3);
 b = a';
 c = transpose(a);
 d = ctranspose(a);

(2)含复数

  非共轭转置: .'  或  transpose

  共轭转置: '  或  ctranspose

  

 % 含复数
 a = rand(3,4) +rand(3,4)*i;
 b = a.' % 非共轭转置
 c = a'  % 共轭转置

% 结果
b =

   0.1465 + 0.8877i   0.6311 + 0.0646i   0.8593 + 0.4362i
   0.9742 + 0.8266i   0.5708 + 0.3945i   0.9969 + 0.6135i
   0.5535 + 0.8186i   0.5155 + 0.8862i   0.3307 + 0.9311i
   0.4300 + 0.1908i   0.4918 + 0.2586i   0.0710 + 0.8979i


c =

   0.1465 - 0.8877i   0.6311 - 0.0646i   0.8593 - 0.4362i
   0.9742 - 0.8266i   0.5708 - 0.3945i   0.9969 - 0.6135i
   0.5535 - 0.8186i   0.5155 - 0.8862i   0.3307 - 0.9311i
   0.4300 - 0.1908i   0.4918 - 0.2586i   0.0710 - 0.8979i

9、数组的翻转

(1)上下翻转flipud

  结果数组B = flipud(数组A)

(2)左右翻转fliplf

  结果数组B = fliplr(数组A)

3)flip函数

  结果数组B = flip(数组A)

  结果数组B = flip(数组A,1) 等价上下翻转

  结果数组B = flip(数组A,2) 等价左右翻转

(4)rot90函数

  结果数组B = rot90(数组A,k ) 把数组A按照逆时针旋转90*k度,k默认值为1;

  k为负数时为顺时针旋转。

 %% 数组翻转
 % flipud
 A = magic(4);
 B = flipud(A);
 % fliplr
 A = magic(4);
 B = fliplr(A);
 % flip
 A = magic(3); 
 B = flip(A,1); % 上下
 C = flip(A,2); % 左右
 % rot90
 A = magic(3)
 B = rot90(A) % 逆时针旋转90度
 C = rot90(A,2) % 逆时针旋转180度

10、数组尺寸调整

(1)reshape函数

  结果数组B = reshape(数组A,a,b)   将数组A调整为a行

  单索引不变

%% 数组尺寸调整
A = magic(4);
B = reshape(A,2,8); % 将数组A变换为2行8列

11、数组与标量的运算

(1)基本运算

  加:结果数组B = 数组A + 标量

  减:结果数组B = 数组A - 标量

  乘:结果数组B = 数组A * 标量

  除:结果数组B = 数组A / 标量

% 基本运算
a = ones(5)
b = a + 2 % 加
c = a - 2 % 减
d = a * 5 % 乘法
e = a / 10 % 除法



a =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1


b =

     3     3     3     3     3
     3     3     3     3     3
     3     3     3     3     3
     3     3     3     3     3
     3     3     3     3     3


c =

    -1    -1    -1    -1    -1
    -1    -1    -1    -1    -1
    -1    -1    -1    -1    -1
    -1    -1    -1    -1    -1
    -1    -1    -1    -1    -1


d =

     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5
     5     5     5     5     5


e =

    0.1000    0.1000    0.1000    0.1000    0.1000
    0.1000    0.1000    0.1000    0.1000    0.1000
    0.1000    0.1000    0.1000    0.1000    0.1000
    0.1000    0.1000    0.1000    0.1000    0.1000
    0.1000    0.1000    0.1000    0.1000    0.1000

(2)乘方运算

  正整数:结果数组B = 数组A^2  (要求A是方阵)——两个数组相乘

  负数:结果数组B = 数组A^(-1)  计算数组A的逆矩阵

  小数:结果数组B = 数组A^(0.25)   B^4 = A

% 乘方运算
a = [1 3; 5 7];
b = a^2; % 计算a的2次幂
c = a^(-1); % 计算a的逆矩阵
d = a^(0.25); % 计算a的小数次幂


b =

    16    24
    40    64


c =

   -0.8750    0.3750
    0.6250   -0.1250


d =

   0.8898 + 0.5551i   0.3180 - 0.2108i
   0.5300 - 0.3514i   1.5259 + 0.1334i

12、数组之间的运算

(1)加减法运算:(点对点相加减

  要求:参与运算的数组应该具有相等的尺寸

% 加减法运算
a = [1 2; 3 4];
b = [2 3 ;4 5];
c = a+b;
d = b-a;

c =

     3     5
     7     9


d =

     1     1
     1     1

(2)乘法:(正常的矩阵乘法运算)

  要求:数组维数相容     A*B,A的列数等于B的行数

a = [1 2 3;4 5 6];
b = ones(3)*3;
c = a*b

c =

    18    18    18
    45    45    45

(3)除法:

  A/B:A*inv(B) 或 A*pinv(B)

  A\B:inv(A)*B 或 pinv(A)*B

  inv数组求逆矩阵,pinv广义数组求逆函数

% 除法运算
a = rand(4);
b = rand(4);
c = a/b   % a除去b的逆
d = a\b   % a的逆除以b


c =

    1.5629   -0.3945   -1.5193   -0.1687
    0.3468   -0.6816    0.3584    0.3173
    2.1534   -1.1947   -1.4572   -0.1862
   -0.4125    0.9986    1.4803   -0.0680


d =

    2.2385    2.0726    1.8485    1.5375
    1.9528    1.4157    2.0773    1.1141
   -4.3650   -2.5815   -2.8704   -1.3101
    3.4662    1.2311    1.4120    0.6752

13、数组的点运算

(1)乘法:(点对点相乘)

  【注意】:参与运算的数组应该具有相同的的尺寸;

       a.*b 表示a和b中对应的元素相乘;

       a.*b 与 b.*a 等价

% 乘法
a = magic(3);
b = eye(3);
c = a.*b

c =

     8     0     0
     0     5     0
     0     0     2

(2)除法:

  参与运算的两个数组必须大小相等;

  参与运算的两个数组的对应元素做除法;

  分为a.\b(b做分子)  与 b./a(b做分子)——总结:斜杠上的为分子

% 除法
a = magic(3);
b = ones(3);
c = a.\b   % b做分子
d = a./b   % a做分子

c =

    0.1250    1.0000    0.1667
    0.3333    0.2000    0.1429
    0.2500    0.1111    0.5000


d =

     8     1     6
     3     5     7
     4     9     2

(3)乘方:求幂

  求n个相同因数乘积的运算,叫做乘方。

  乘方的结果叫做幂(power)。

  【分类】:(点对数或点对点)

    数组.^标量       A.^3 ——数组的各个点3次幂,数组元素为底

    标量.^数组       3.^A ——分别把这个数组中的元素做为幂,3为底

    数组.^数组       A.^B ——A数组的元素为底,B数组的元素为幂

% 乘方
a = magic(3)
b = ones(3);
c = a.^3
d = 2.^a
e = a.^b

a =

     8     1     6
     3     5     7
     4     9     2


c =

   512     1   216
    27   125   343
    64   729     8


d =

   256     2    64
     8    32   128
    16   512     4


e =

     8     1     6
     3     5     7
     4     9     2

  

posted @ 2020-03-29 13:00  红叶楠木  阅读(1996)  评论(0编辑  收藏  举报