MATLAB学习笔记——5.1 数据统计与分析

1、求矩阵的最大元素和最小元素

  • 函数:
    max():求向量或矩阵的最大元素;
    min():求向量或矩阵的最小元素;

  • 当参数为向量时,上述函有两种调用格式:
    (1)y=max(X):返回向量 : X的最大值存y,如果 X中包含复数元素,则按模取最大值。
    (2)[y,k ]=max(X):返回向量 X的最大值存入y,最大值元素的序号存入 k,如果 X中包含复数元素,则按模取最大值。

  • 例5.1.1:
    求向量x的最大元素,其中x=[-43,72,9,16,23,47]。

x=[-43,72,9,16,23,47];
y=max(x)
[y,k]=max(x)

命令行窗口:

>> x=[-43,72,9,16,23,47];
>> y=max(x)
y =
    72
   
>> [y,k]=max(x)
y =
    72
k =
     2
  • 当参数为矩阵时,函数有三种调用形式:
    (1)max(A):返回一个行向量,的第i个元素是矩阵A的第i列上的最大值。
    (2)[Y,U]=max(A):返回行向量Y和U,Y向量记录A中每列的最大值,U向量记录每列最大值元素的行号。
    (3)max(A,[],dim):dim取1或2。dim取1时,该函数的功能和max(A)完全相同;dim取2时,该函数返回一个列向量其第i个元素是A矩阵的第i行上的最大值。

  • 思考:对矩阵按行求最大元素,仅使用第一种格式能够做到吗?

  • 想法:连续使用两次max()函数就能实现,第一次对矩阵A使用,返回每个列的最大值组成的向量,接着对这个数组使用该函数,最后返回矩阵的最大值。(max(max(A)))

  • 例5.1.2:
    求矩阵A的每行及每列的最大元素,并求整个矩阵的最大元素。
    MATLAB学习笔记——5.1 数据统计与分析_第1张图片

A=[13,-56,78;25,63,-235;78,25,563;1,0,-1];
max(A)
max(A,[],2)
max(max(A)) 

命令行窗口:

>> A=[13,-56,78;25,63,-235;78,25,563;1,0,-1];
>> max(A)
ans =
    78    63   563

>> max(A,[],2)
ans =
    78
    63
   563
     1

>> max(max(A)) 
ans =
   563
  • 思考:用什么方法只调用一次max函数就能求得整个矩阵的最大值?
  • 想法:先将A中所有元素堆叠成列向量,然后只需要使用一次max函数
max(A(:)

2、求矩阵的平均值 和中求矩阵的平均值 和中求矩阵的平均值 和中求矩阵的平均值

  • 平均值:指算术,即每项数据之和除以。
  • 中值:指在数据序列其的大小恰好处间元素。如果个为奇数,则取值为大小位于中间的元素;如果据个偶两素的平均值。
  • 在MATLAB 中,求平均值和的函数分别为:
    mean() :求算术平均值。
    median() :求中值。
  • 思考:有了平均值,为什么还要中值?
  • 想法:中值与平均值未必相等。
  • 例5.1.3:
    某学生宿舍的5位同学月生活费如向量x所示,其中,小明同学家境一般,请问他应该按什么标准向父母主张生活费额度才较为合理。x=[1200,800,1500,1000,5000]
x=[1200,800,1500,1000,5000];
mean(x)
median(x)

运行结果:

>> x=[1200,800,1500,1000,5000];
>> mean(x)
ans =
        1900

>> median(x)
ans =
        1200

3、求和与求积

  • sum():求和函数。
  • prod():求积函数。

4、 累加和与累乘积

设U=(u1,u2,…,un)是一个向量,V、W是与U等长的另外两个向量,并且
在这里插入图片描述则分别称V、W为U的累加和向量和累乘积向量。
在MATLAB中,求累加和与累乘积的函数分别为:

  • cumsum():累加和函数。
  • cumprod():累乘积函数。
  • 例5.1.4
    求向量X=[1,2,3,4,5,6,7,8,9,10]的积与累乘积。
>> X=[1,2,3,4,5,6,7,8,9,10];
>> y1=prod(X)
y1=
		3628800 
>> y2=cumprod(X)
y2=
		y2 =
           1           2           6          24         120         720        5040       40320      362880     3628800

5. 标准差与相关系数

  • 标准差用于计算数据偏离平均数的距离的平均值,其计算公式为
    在这里插入图片描述
  • MATLAB中计算标准差的函数为std(),其调用格式为:
    (1)std(X):计算向量X的标准差。
    (2)std(A):计算矩阵A的各列的标准差。
    (3)std(A,flag,dim): flag取0或1,当flag=0时,按S1所列公式计算样本标准方差;当flag=1时,按S2所列公式计算总体标准方差。在默认情况下,flag=0,dim=1。
  • 例5.1.5
    生成满足正态分布的50000*4随机矩阵,用不同的形式求其各列之间的标准差。
>> x=randn(50000,4);
>> y1=std(x,0,1)
y1 =
   0.9955    0.9979    1.0046    0.9990
>> y2=std(x,1,1)
y2 =
   0.9955    0.9979    1.0046    0.9990
>> x1=x';
>> y3=std(x1,0,2);
>> y3'
ans =
   0.9955    0.9979    1.0046    0.9990
>> y4=std(x1,1,2);
>> y4' 
ans =
   0.9955    0.9979    1.0046    0.9990
  • 相关系数能够反映两组数据序列之间相互关系,其计算公式为
    在这里插入图片描述
  • 在MATLAB中,计算相关系数的函数为corrcoef(),其调用格式为:
    (1)corrcoef(A):返回由矩阵A所形成的一个相关系数矩阵,其中,第i行第j列的元素表示原矩阵A中第i列和第j列的相关系数。
    (2)corrcoef(X,Y):在这里,X,Y是向量,它们与corrcoef([X,Y])的作用一
    样,用于求X、Y向量之间的相关系数。
  • 例5.1.6
    某新产品上市,在上市之前,公司物流部门把新产品分配到不同地区的10个仓库进行销售。产品上市一个月后,公司要对各种不同的分配方案进行评估,以便在下一次新产品上市时进行更准确的分配,避免由于分配不当而产生的积压和断货。下表(见课件)是相关数据,请判断那种分配方案最为合理。
    MATLAB学习笔记——5.1 数据统计与分析_第2张图片
>> A=[5032,6000,5100,5200;6532,6500,6600,5800;
      5500,7000,5400,4800;4530,4000,4300,4200;
      2300,2000,2200,2500;3254,3000,3500,3000;
      8095,9000,7800,8500;7530,8000,7000,7500;
      3841,3200,3500,3200;4500,5200,4800,4000];
>> corrcoef(A)
ans =
    1.0000    0.9630    0.9906    0.9782
    0.9630    1.0000    0.9694    0.9466
    0.9906    0.9694    1.0000    0.9635
    0.9782    0.9466    0.9635    1.0000

6、 排序

  • 在MATLAB 中,排序函数为 sort() ,其调用格式为:
    (1)sort(X) :对向量 X按升序排列。
    (2)[Y,I]=sort( A,dim,mode ),其中 dim 指明对 A的列还是行进排序。 mode 指明按升序还是降排,若取“ ascend” ,则按升序;若取“ descend” , 则按降序, 默认为升。输出参数中Y是排序后的矩阵,而 I记录 Y中的元素 在A中位置。
  • 例5.1.7
    对下列矩阵(见课件)做各种排序。
    在这里插入图片描述
>> A=[1,-8,5;4,12,6;13,7,-13];
>> sort(A)
ans =
     1    -8   -13
     4     7     5
    13    12     6
>> sort(A,2,'descend')
 ans =
     5     1    -8
    12     6     4
    13     7   -13
>> [X,I]=sort(A)
X =
     1    -8   -13
     4     7     5
    13    12     6
I =
     1     1     3
     2     3     1
     3     2     2

7、联系与讨论

7.1 除NaN之外的其他数值元素求和

当向量元素的值暂时无法确定时,可以将其表示为NaN,求向量中除NaN之外的其他数值元素之和。例如A=[1:5, NaN, 10],A中除NaN之外的其他元素之和是25。写出命令并上机验证。

  • 提示:考虑使用isnan函数,该函数的功能演示如下:
>> A=[1:5, NaN, 10]
A =
     1     2     3     4     5   NaN    10
>> isnan(A)
ans =
  1×7 logical 数组
   0   0   0   0   0   1   0

解决思路:

Step1 记录矩阵的size信息,并将矩阵化为列向量

Step2 通过innan函数找到零元素对应的位置的逻辑数组

Step3 将Nan数据替换为0(这样计算时就不影响结果了)

Step4 对向量求和,同时可以将向量恢复成原来的样子

具体代码的实现:

%% Step0 生成随机维数(0-9)的包含随机NaN的矩阵a
A=fix(10*rand(fix(1+10*(rand())),fix(1+10*(rand()))));
[m,n]=size(A);
a=A(:);
criterion=1;
while criterion
    nannum=round(rand(m*n,1));
    nanposi=find(nannum);
    criterion=isempty(nanposi);
end
a(nanposi)=NaN;
a=reshape(a,m,n);
disp 'a='
disp (a)
%% Step1 记录矩阵的size信息,并将矩阵化为列向量
[m,n]=size(a);
a=a(:);
%% Step2 通过innan函数找到零元素对应的位置的逻辑数组
b=isnan(a);
%% Step3 将Nan数据替换为0(这样计算时就不影响结果了)
a(b)=0;
%% Step4 对向量求和,同时可以将向量恢复成原来的样子
ans1=sum(a);
a=reshape(a,m,n);
disp 'a''='
disp(a)
disp 'ans='
disp(ans1)

7.2 分析函数功能

若A为一个矩阵,试分析函数“max(A,[],2)”和“max(A,2)”各有什么功能?请上机验证。
实验代码:

A=magic(5);
ans1=max(A,[],2);
ans2=max(A,2);
disp 'A='
disp(A)
disp 'max(A,[],2)='
disp(ans1)
disp 'max(A,2)='
disp(ans2)

C=max(A,B)
returns an array the same size as A and B with the largest elements taken from A or B. The dimensions of A and B must match, or they may be scalar.
返回一个与A和B大小相同的数组,其中最大元素取自A或B.A和B的维度必须匹配,或者它们可以是标量。

  • 对于max(A,[],2)我很清楚,表示寻找A的每行的最大值,并生成列向量,
  • 对于max(A,2),看一下运行结果,光看帮助文档还解决不了问题

一个运行结果:

A=
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9
max(A,[],2)=
    24
    23
    22
    21
    25
max(A,2)=
    17    24     2     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

好像只有一点点地方不一样,进一步验证A与结果的差别

A==ans2
ans =
     1     1     0     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

发现只有一个元素和原来不同,这个元素原来是1。
也就是说,

  • C=max(A,B):
  • 当一个为标量时,对于A中的每一个元素,与B进行比较,取最大值;
  • 当都为矩阵,且维度匹配时,对于每一个元素进行比较,取最大值;
    验证:
a=[1 2 3 4 5 6 7 8 9];
b=[9 8 7 6 5 4 3 2 1];
c=max(a,b);
disp(c);

应该得到的结果为:
9 8 7 6 5 6 7 8 9
实际得到的结果为:

     9     8     7     6     5     6     7     8     9

符合预期。
再验证一下b为标量的情况:

a=magic(5);
b=20;
c=max(a,b);
disp(a);
disp(c);

结果为:

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

    20    24    20    20    20
    23    20    20    20    20
    20    20    20    20    22
    20    20    20    21    20
    20    20    25    20    20

结果符合预期。

7.3 写出操作命令

利用MATLAB提供的randn函数生成符合正态分布的10×5随机矩阵A,进行如下操作:
(1)A各列元素的均值和标准方差。
(2)A的最大元素和最小元素。
(3)求A每行元素的和以及全部元素之和。
(4)分别对A的每列元素按升序、每行元素按降序排序。

  • 思路:

Step0 生成符合正态分布的10×5随机矩阵A

Step1 A各列元素的均值和标准方差

Step2 A的最大元素和最小元素。

Step3 求A每行元素的和以及全部元素之和。

Step4 分别对A的每列元素按升序、每行元素按降序排序。

代码的实现:

%% Step0 生成符合正态分布的10×5随机矩阵A
A=randn(10,5)
%% Step1 A各列元素的均值和标准方差
mean=mean(A(:))
standard_deviation=std(A(:))
%% Step2 A的最大元素和最小元素。
max=max(A(:))
min=min(A(:))
%% Step3 求A每行元素的和以及全部元素之和。
sum_for_rows=sum(A,2)
sum_for_all=sum(A(:))
%% Step4 分别对A的每列元素按升序、每行元素按降序排序。
sorted=sort(sort(A,1,'ascend'),2,'descend')
  • 正态分布矩阵的生成:randn();

你可能感兴趣的:(2018年10月,MATLAB,MATLAB)