第9章数据分析 由于MA∏LAB面向矩阵,所以它很容易对数据集合进行统计分析。按规定,数据集存 储在面向列的矩阵里。也就是,一个矩阵的每一列代表不同的被测变量,每一行代表各个样 本或观察值。例如,让我们假定,一个月31天的三城市每日高温(单位为C)被记录,并赋 给脚本M文件中的变量 temps,在精通 MATLAB工具箱里取名为 mmtemp m。运行M文 件,把变量 temps放在 MATLAB工作空间里。这样,变量 temps包含: temps 2524 89586 9241 17 23 985802 990770878897788 820 39042 06757 78022
第 9 章 数 据 分 析 由于 MATLAB 面向矩阵,所以它很容易对数据集合进行统计分析。按规定,数据集存 储在面向列的矩阵里。也就是,一个矩阵的每一列代表不同的被测变量,每一行代表各个样 本或观察值。例如,让我们假定,一个月 31 天的三城市每日高温(单位为 0C)被记录,并赋 给脚本 M 文件中的变量 temps,在精通 MATLAB 工具箱里取名为 mmtemp.m。运行 M 文 件,把变量 temps 放在 MATLAB 工作空间里。这样,变量 temps 包含: » temps temps = 12 8 18 15 9 22 12 5 19 14 8 23 12 6 22 11 9 19 15 9 15 8 10 20 19 7 18 12 7 18 14 10 19 11 8 17 9 7 23 8 8 19 15 8 18 8 9 20 10 7 17 12 7 22 9 8 19 12 8 21 12 8 20 10 9 17 13 12 18 9 10 20 10 6 22 14 7 21 12 5 22 13 7 18
每一行包含了给定一天的高温;每一列包含不同城市的高温。为了使数据可视,把它绘 d=1:31 number the days of the mor 》plot(d, temps) label( Day of Month),ylabel( Celsius >)title( Daily High Temperatures in Three Cities) (见图9.1) Daily High Temperatures in Three Cities 25 15 10 10 15 Day of Month 图9.1三个城市的每日高温 上面的plot命令也说明了plot命令用法的另一种形式变量d是一个长度为31的向量 而 temps是一个31×3矩阵。给定这些数据,plt命令绘出了 temps对每一列d的曲线。绘 图在第7和8章进一步讨论 为了说明 MATLAB数据分析的一些功能,根据上面温度数据考虑以下命令 avg temp 11.96778.2258198710
15 10 23 13 11 24 12 12 22 每一行包含了给定一天的高温;每一列包含不同城市的高温。为了使数据可视,把它绘 图: » d=1:31; % number the days of the month » plot(d, temps) » xlabel(' Day of Month '),ylabel(' Celsius ') » title(' Daily High Temperatures in Three Cities ') (见图 9.1) 0 5 10 15 20 25 30 35 5 10 15 20 25 Day of Month Celsius Daily High Temperatures in Three Cities 图 9.1 三个城市的每日高温 上面的 plot 命令也说明了 plot 命令用法的另一种形式。变量d 是一个长度为 31 的向量, 而 temps 是一个 31×3 矩阵。给定这些数据,plot 命令绘出了 temps 对每一列 d 的曲线。绘 图在第 7 和 8 章进一步讨论。 为了说明 MATLAB 数据分析的一些功能,根据上面温度数据考虑以下命令。 » avg_temp=mean(temps) avg_temp = 11.9677 8.2258 19.8710
表明第三个城市有最高平均温度。这里 MATLAB分别地找出了各列的平均值。 >)avg avg=mean(avg temp) gave 13.3548 找出了三个城市的总平均温度。当输入到数据分析函数是行或列向量时, MATLAB仅 对向量执行运算,返回一个标量。 考虑从各城市的均值求每日偏差的问题。即必须从 temps的i列中减去 avg temp( 我们不能仅仅用以下的语句 ?? Error using ==> Matrix dimensions must agree 因为这个操作不是一个已定义的数组操作 temps是31×3和 avg temp是1×3)。或许 最直接的方法是使用For循环 dev(: i=temps(: 1)-avg temp(i) 0.0323-0.225818710 3.03230.77422.1290 0.0323-3.2258-0.8710 2.0323-0.22583.1290 0.03232.22582.129 -0.96770.7742-0.8710 3.03230.7742-4.8710 3.96771.77420.1290 7.0323-1.2258 8710 0.0323-1.225818710 2.03231.7742-0.8710 3.0323-0.2258-1.8710 3.96770.77420.1290
表明第三个城市有最高平均温度。这里 MATLAB 分别地找出了各列的平均值。 » avg_avg=mean(avg_temp) avg_avg = 13.3548 找出了三个城市的总平均温度。当输入到数据分析函数是行或列向量时,MATLAB 仅 对向量执行运算,返回一个标量。 考虑从各城市的均值求每日偏差的问题。即必须从 temps 的 i 列中减去 avg_temp(i)。 我们不能仅仅用以下的语句 » temps-avg_temp ??? Error using ==> - Matrix dimensions must agree. 因为这个操作不是一个已定义的数组操作(temps 是 31×3 和 avg_temp 是 1×3)。或许 最直接的方法是使用 For 循环。 for i=1:3 tdev( : , i)=temps( : , i)-avg_temp(i) ; end » tdev tdev = 0.0323 -0.2258 -1.8710 3.0323 0.7742 2.1290 0.0323 -3.2258 -0.8710 2.0323 -0.2258 3.1290 0.0323 -2.2258 2.1290 -0.9677 0.7742 -0.8710 3.0323 0.7742 -4.8710 -3.9677 1.7742 0.1290 7.0323 -1.2258 -1.8710 0.0323 -1.2258 -1.8710 2.0323 1.7742 -0.8710 -0.9677 -0.2258 -2.8710 -2.9677 -1.2258 3.1290 -3.9677 -0.2258 -0.8710 3.0323 -0.2258 -1.8710 -3.9677 0.7742 0.1290
1.9677-1.2258-2.8710 0.0323-1.22582.1290 2.9677-0.2258-0.8710 0.0323-0.22581.129 0.03230.22580.12 1.96770.742-28710 1.03233.7742-1.8710 2.9677177420.1290 19677-2225821290 2.0323-1.22581.129 0.0323-3.22582.1290 1.03231.22581.8710 3.0323177423.1290 1.0323277424.1290 0.03233.77422.1290 虽然使用上面的方法有效,但比使用 MATLAB的数组操作功能要慢。复制 avg temp, 使得它与 temps有同样的大小,然后再做减法,这样就快得多 >)tdev=temps-avg temp(ones(31, 1), 0.0323-0.2258-1.871 3.03230.77422.1290 0.0323-3.22580.8710 2.0323-0.22583.1290 0.0323-2.22582.1290 -0.96770.7742-0.8710 3.03230.7742-4.8710 3.96771.77420.1290 7.03231.2258-1.8710 0.0323-1.2258-1.8710 2.03231.7742-0.8710 -0.9677-0.2258-2.8710 -2.9677-1.22583.1290 -3.9677-0.2258-0.8710 3.0323-0.2258-1.8710 3.96770.77420.1290 0.0323-1.22582.1290 -29677-0.2258-0.8710 0.0323-0.22581.1290
-1.9677 -1.2258 -2.8710 0.0323 -1.2258 2.1290 -2.9677 -0.2258 -0.8710 0.0323 -0.2258 1.1290 0.0323 -0.2258 0.1290 -1.9677 0.7742 -2.8710 1.0323 3.7742 -1.8710 -2.9677 1.7742 0.1290 -1.9677 -2.2258 2.1290 2.0323 -1.2258 1.1290 0.0323 -3.2258 2.1290 1.0323 -1.2258 -1.8710 3.0323 1.7742 3.1290 1.0323 2.7742 4.1290 0.0323 3.7742 2.1290 虽然使用上面的方法有效,但比使用 MATLAB 的数组操作功能要慢。复制 avg_temp, 使得它与 temps 有同样的大小,然后再做减法,这样就快得多。 » tdev=temps-avg_temp(ones(31,1),:) tdev = 0.0323 -0.2258 -1.8710 3.0323 0.7742 2.1290 0.0323 -3.2258 -0.8710 2.0323 -0.2258 3.1290 0.0323 -2.2258 2.1290 -0.9677 0.7742 -0.8710 3.0323 0.7742 -4.8710 -3.9677 1.7742 0.1290 7.0323 -1.2258 -1.8710 0.0323 -1.2258 -1.8710 2.0323 1.7742 -0.8710 -0.9677 -0.2258 -2.8710 -2.9677 -1.2258 3.1290 -3.9677 -0.2258 -0.8710 3.0323 -0.2258 -1.8710 -3.9677 0.7742 0.1290 -1.9677 -1.2258 -2.8710 0.0323 -1.2258 2.1290 -2.9677 -0.2258 -0.8710 0.0323 -0.2258 1.1290
0.03230.22580.1290 -1.96770.7742-28710 03233.7742-1.8710 2.96771.77420.1290 19677-2.22582.1290 2.0323-1.22581.1290 0.0323-3.22582.1290 1.0323-1.2258-1.8710 3.03231.77423.1290 03232.77424.1290 0.03233.77422.1290 这里 avg temp(ones31,1),)复制 avg temp的第一行(且仅)31次,创建了一个31×3的 矩阵,其第i列是 avg temp(i) 》 max temp=max( temps) nax temp 191224 找出了每个城市一个月的最高温度。 >[max temp, x]=max( temps) max temp 找出了每个城市的最高温度和出现最高温度的行下标x。对于这个例子,当发生最高温 度时,x辨认了月中的日期 ))min temp-=min(temps) 找出了各城市一个月的最低温度。 >[min temp, n]=min(temps) min temp
0.0323 -0.2258 0.1290 -1.9677 0.7742 -2.8710 1.0323 3.7742 -1.8710 -2.9677 1.7742 0.1290 -1.9677 -2.2258 2.1290 2.0323 -1.2258 1.1290 0.0323 -3.2258 2.1290 1.0323 -1.2258 -1.8710 3.0323 1.7742 3.1290 1.0323 2.7742 4.1290 0.0323 3.7742 2.1290 这里 avg_temp(ones(31, 1),:)复制 avg_temp 的第一行(且仅)31 次,创建了一个 31×3 的 矩阵,其第 i 列是 avg_temp(i)。 » max_temp=max(temps) max_temp = 19 12 24 找出了每个城市一个月的最高温度。 » [max_temp, x]=max(temps) max_temp = 19 12 24 x = 9 23 30 找出了每个城市的最高温度和出现最高温度的行下标 x。对于这个例子,当发生最高温 度时,x 辨认了月中的日期。 » min_temp=min(temps) min_temp = 8 5 15 找出了各城市一个月的最低温度。 » [min_temp, n]=min(temps) min_temp = 8 5 15 n = 8 3 7
找出了每个城市的最低温度和出现最低温度时行下标n。对于这个例子,当发生最低温 度时,n辨认月中的日期 >)s dev=std(temps) s dev= 2.50981.76462.232 找出 temps的标准偏差 >)daily change=diff( temps) daily change 34520 641 72233 53213122
找出了每个城市的最低温度和出现最低温度时行下标 n。对于这个例子,当发生最低温 度时,n 辨认月中的日期。 » s_dev=std(temps) s_dev = 2.5098 1.7646 2.2322 找出 temps 的标准偏差。 » daily_change=diff(temps) daily_change = 3 1 4 -3 -4 -3 2 3 4 -2 -2 -1 -1 3 -3 4 0 -4 -7 1 5 11 -3 -2 -7 0 0 2 3 1 -3 -2 -2 -2 -1 6 -1 1 -4 7 0 -1 -7 1 2 2 -2 -3 2 0 5 -3 1 -3 3 0 2 0 0 -1 -2 1 -3 3 3 1 -4 -2 2 1 -4 2 4 1 -1 -2 -2 1 1 2 -4 2 3 5 -2 1 1
计算每日高温之间的偏差,它描述了逐天日高温的变化有多大。例如,dal 的 第一行是每月的第一天和第二天之间的日温度变化量。 9.1数据分析函数 在 MATLAB里的数据分析是按面向列矩阵而进行的。不同的变量存储在各列中,而每 行表示每个变量的不同观察。 MATLAB统计函数包括 表9 数据分析函数 求相关系数 协方差矩阵 把向量分类为复共轭对 oss(x, y) 向量的向量积 列累计积 cumsum(x 列累计和 del2(A) 五点离散拉氏算子 计算元素之间差 dot(x, y) 向量的点积 gradient(Z, dx, dy) 近似梯度 histogram(x) 直方图和棒图 max(x), max(x, y) 最大分量 mean(x 均值或列的平均值 nedian(x) 列的中值 min(x), min(x, y) 最小分量 prod(x) 列元素的积 rand(x) 均匀分布随机数 randn (x) 正态分布随机数 sort(x) 按升序排列 列的标准偏差 subspace(A, B) 两个子空间之间的夹角 sum(x) 各列的元素和 9.2M文件举例 在这一章里,说明在精通 MATLAB工具箱里的两个函数。这些函数说明了本章所示的 mn和max函数的变种和如何编写一个M文件。关于M文件的更多信息,参阅第8章。 在讨论M文件函数mmin和mmax的内部结构之前,考虑他们有什么功能
-1 1 -2 计算每日高温之间的偏差,它描述了逐天日高温的变化有多大。例如,daily_change 的 第一行是每月的第一天和第二天之间的日温度变化量。 9.1 数据分析函数 在 MATLAB 里的数据分析是按面向列矩阵而进行的。不同的变量存储在各列中,而每 行表示每个变量的不同观察。MATLAB 统计函数包括 表 9.1 数 据 分 析 函 数 corrcoef(x) 求相关系数 cov(x) 协方差矩阵 cplxpair(x) 把向量分类为复共轭对 cross(x, y) 向量的向量积 cumprod(x) 列累计积 cumsum(x) 列累计和 del2(A) 五点离散拉氏算子 diff(x) 计算元素之间差 dot(x, y) 向量的点积 gradient(Z, dx, dy) 近似梯度 histogram(x) 直方图和棒图 max(x), max(x, y) 最大分量 mean(x) 均值或列的平均值 median(x) 列的中值 min(x), min(x, y) 最小分量 prod(x) 列元素的积 rand(x) 均匀分布随机数 randn(x) 正态分布随机数 sort(x) 按升序排列 std(x) 列的标准偏差 subspace(A, B) 两个子空间之间的夹角 sum(x) 各列的元素和 9.2 M 文件举例 在这一章里,说明在精通 MATLAB 工具箱里的两个函数。这些函数说明了本章所示的 min 和 max 函数的变种和如何编写一个 M 文件。关于 M 文件的更多信息,参阅第 8 章。 在讨论 M 文件函数 mmin 和 mmax 的内部结构之前,考虑他们有什么功能
>) amn temp=mmin(temps) amn temp amx temp 24 -maxime 具有一个输出参量的函数mmin找出矩阵中的单个最小值。用第二个输出参量,返回单 个最小值的行和列的下标。除了mmax返回矩阵中的单个最大值外,函数mmax的工作方 式与mmin相同。这些M文件的函数是: function[m, i]=mmin(a) MMIN Matrix minimum value MMIN(A)returns the minimum value in the matrix A %o M, I=MMIN(A)in addition returns the indices of the minimum value in I=[row col] o Copyright(c)1996 by Prentice Hall, Inc if nargout==2, % return indices [m, 1=min(a) m-min(min(a
» amn_temp=mmin(temps) amn_temp = 5 » [m , i]=mmin(temps) m = 5 i = 3 2 » amx_temp=mmax(temps) amx_temp = 24 » [m , j]=mmax(temps) m = 24 j = 30 3 具有一个输出参量的函数 mmin 找出矩阵中的单个最小值。用第二个输出参量,返回单 个最小值的行和列的下标。除了 mmax 返回矩阵中的单个最大值外,函数 mmax 的工作方 式与 mmin 相同。这些 M 文件的函数是: function [m , i]=mmin(a) % MMIN Matrix minimum value. % MMIN(A) returns the minimum value in the matrix A % [M,I] = MMIN(A) in addition returns the indices of % the minimum value in I = [row col]. % Copyright (c) 1996 by Prentice Hall,Inc. if nargout==2, % return indices [m , i]=min(a) ; [m , ic]=min(m) ; i=[i(ic) ic] ; else, m=min(min(a)); end
MMAX Matrix maximum value MMAX(A)returns the maximum value in the matrix A %[M,I]=MMAX(A)in addition returns the indices of the maximum value in I=[row col] Copyright(c)1996 by Prentice Hall, Inc if nargout==2 return indices Im, i=max(a) Fli(ic)ic] m-max(maxi a end
function [m , i]=mmax(a) % MMAX Matrix maximum value. % MMAX(A) returns the maximum value in the matrix A % [M,I] = MMAX(A) in addition returns the indices of % the maximum value in I = [row col]. % Copyright (c) 1996 by Prentice Hall,Inc. if nargout==2, % return indices [m , i]=max(a) ; [m , ic]=max(m) ; i=[i(ic) ic] ; else, m=max(max(a)) ; end