函数:
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)))
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(:)
x=[1200,800,1500,1000,5000];
mean(x)
median(x)
运行结果:
>> x=[1200,800,1500,1000,5000];
>> mean(x)
ans =
1900
>> median(x)
ans =
1200
设U=(u1,u2,…,un)是一个向量,V、W是与U等长的另外两个向量,并且
则分别称V、W为U的累加和向量和累乘积向量。
在MATLAB中,求累加和与累乘积的函数分别为:
>> 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
>> 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
>> 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
>> 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
当向量元素的值暂时无法确定时,可以将其表示为NaN,求向量中除NaN之外的其他数值元素之和。例如A=[1:5, NaN, 10],A中除NaN之外的其他元素之和是25。写出命令并上机验证。
>> 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
解决思路:
具体代码的实现:
%% 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)
若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的维度必须匹配,或者它们可以是标量。
一个运行结果:
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。
也就是说,
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
结果符合预期。
利用MATLAB提供的randn函数生成符合正态分布的10×5随机矩阵A,进行如下操作:
(1)A各列元素的均值和标准方差。
(2)A的最大元素和最小元素。
(3)求A每行元素的和以及全部元素之和。
(4)分别对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')