第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