x2 =
0 0 300 300 x3=ps(1).position(1,3)
x3 = 300
程序分析:x1是一个结构;x2是矩阵;x3是标量。 (2) 用getfield获取结构数组的数据
x4=getfield(ps,{1},'color')
x4 = red
x5=getfield(ps,{1},'color',{1})
x5 = r
(3) 用setfield设置结构数组的数据
ps=setfield(ps,{1},'color','green'); ps(1)
ans =
name: '曲线1' color: 'green'
position: [0 0 300 300]
3. 结构数组域的获取
(1) 使用fieldnames获取结构数组的所有域:
x6=fieldnames(ps)
x6 =
'name' 'color'
'position'
程序分析:x6是元胞数组,各变量在工作空间的数据类型如图2.8所示。
图2.8 工作空间 (2) 获取结构数组域的数据
? 使用“[]”合并相同域的数据并排成水平向量:
all_x=[ps.name]
all_x =
曲线1曲线2
? 使用cat将其变成多维数组:
cat(1,ps.position) %沿第一维排列
ans =
0 0 300 300 100 100 300 300
cat(2,ps.position) %沿第二维排列
ans =
0 0 300 300 100 100 300 300 cat(3,ps.position) %沿第三维排列
ans(:,:,1) =
0 0 300 300 ans(:,:,2) =
100 100 300 300
2.6数据分析
数据分析按照以下原则:
? 如果输入是向量,则按整个向量进行运算。 ? 如果输入是矩阵,则按列进行运算。
2.6.1数据统计和相关分析
相关分析包括计算协方差和相关系数,相关系数越大说明相关性越强。
例如,用某年一月份中连续四天的温度数据构成4×3的矩阵a,包括最高温度、最低温度和平均温度如表2.9所示。列为按最高温度、最低温度和平均温度进行分类,而行是每天的温度数据样本。
表2.9 四天的温度
平均温度 5.30 5.10 3.70 1.50 最高温度 13.00 11.80 8.10 7.70
最低温度 0.40 -1.70 0.60 -4.50 对该矩阵进行简单数据统计分析,MATLAB函数如表2.10所示。
表2.10 数据统计分析函数
函数名 max(X) min(X) mean(X) 功能 矩阵中各列的最大值。 矩阵中各列最小值。 矩阵中各列平均值。 例子结果 5.3000 13.0000 0.6000 1.5000 7.7000 -4.5000 3.9000 10.1500 -1.3000 std(X) median(X) var(X) C=cov(X) 矩阵中各列标准差,指各元素与该列平均值(mean)之差的平方和开方。 矩阵中各列的中间元素。 矩阵中各列的方差。 矩阵中各列间的协方差。 矩阵中各列间的相关系数矩阵,与协方差3.9000 10.1500 -1.3000 4.4000 9.9500 -0.6500 3.0667 7.0167 5.6333 3.0667 4.0867 3.0667 4.0867 7.0167 2.7100 3.0667 2.7100 5.6333 1.0000 0.8810 0.7378 0.8810 1.0000 0.4310 0.7378 0.4310 1.0000 sort(a,1)= 1.5000 7.7000 -4.5000 3.7000 8.1000 -1.7000 5.1000 11.8000 0.4000 5.3000 13.0000 0.6000 S=corrcoef(X) C的关系为:S(i,j)=C(i,j)/C(i,i)C(j,j)。对角线为x和y的自相关系数。 沿第n维按模增大重新排序,k为S元素的原位置。 [S,k]=sort(X,n)
2.6.2差分和积分
MATLAB可以通过函数对矩阵的差分和积分等进行方便地运算。常用的差分和积分函数如表2.11所示。
其中矩阵a仍然是前例中的温度数据: a =
5.3000 13.0000 0.4000 5.1000 11.8000 -1.7000 3.7000 8.1000 0.6000 1.5000 7.7000 -4.5000
表2.11 差分和累计的数据处理函数
例子 函数名 功能 输入 diff(X,m,n) 沿第n维求第m阶列向差分。差分是求相邻行之间的差,结果会减少一行。 对Z求x、y方向的数值梯度。 矩阵各列元素的和。 沿第n维求累计和 diff(a,1,1) %沿第一维求一阶差分 gradient(a) %对列求数值梯度 sum(a) cumsum(a,2) %沿列求累计和 cumprod(a,2) %沿列求累计乘积 结果 -0.2000 -1.2000 -2.1000 -1.4000 -3.7000 2.3000 -2.2000 -0.4000 -5.1000 7.7000 -2.4500 -12.6000 6.7000 -3.4000 -13.5000 4.4000 -1.5500 -7.5000 6.2000 -3.0000 -12.2000 15.6000 40.6000 -5.2000 5.3000 18.3000 18.7000 5.1000 16.9000 15.2000 3.7000 11.8000 12.4000 1.5000 9.2000 4.7000 5.3000 68.9000 27.5600 5.1000 60.1800 -102.3060 3.7000 29.9700 17.9820 1.5000 11.5500 -51.9750 12.2000 30.2500 -3.1500 [fx,fy]=gradient(Z) sum(X) cumsum(X,n) cumprod(X,n) 沿第n维求累计乘积 梯形法求积分近似于求元素和,把相邻两点数据的平均值乘以步长表示面积。x为自变量,y为函数。 trapz(X,y) trapz(a) cumtrapz(X,y,n) 用梯形法沿第n维求函数y对自变量x累计积分。 cumtrapz(a)%用梯形法沿列向积分 0 0 0 5.2000 12.4000 -0.6500 9.6000 22.3500 -1.2000 12.2000 30.2500 -3.1500 【例2.26】已知y?e?0.2sin(t),其中t的范围是[0 10],计算y的微分和积分。y的微分和积分曲线如图2.9所示。
t=0:0.5:10;
y=exp(-0.2).*sin(t)
y =
Columns 1 through 7
0 0.3925 0.6889 0.8167 0.7445 0.4900 0.1155
Columns 8 through 14
-0.2872 -0.6196 -0.8003 -0.7851 -0.5776 -0.2288 0.1761
Columns 15 through 21
0.5379 0.7680 0.8100 0.6537 0.3374 -0.0615 -0.4454
d=[0 diff(y)] %计算微分
d =
Columns 1 through 7
0 0.3925 0.2964 0.1277 -0.0722 -0.2545 -0.3744
Columns 8 through 14
-0.4027 -0.3324 -0.1807 0.0152 0.2075 0.3489 0.4049
Columns 15 through 21
0.3618 0.2301 0.0420 -0.1563 -0.3163 -0.3989 -0.3839
s1=0.5*cumsum(y) %用矩形法计算积分,横坐标两点间隔为0.5
s1 =
Columns 1 through 7
0 0.1963 0.5407 0.9491 1.3213 1.5663 1.6241
Columns 8 through 14
1.4805 1.1707 0.7705 0.3779 0.0891 -0.0253 0.0628
Columns 15 through 21
0.3317 0.7157 1.1207 1.4476 1.6163 1.5856 1.3629
s2=cumtrapz(t,y) %用梯形法计算积分
s2 =
Columns 1 through 7
0 0.0981 0.3685 0.7449 1.1352 1.4438 1.5952
Columns 8 through 14
1.5523 1.3256 0.9706 0.5742 0.2335 0.0319 0.0188
Columns 15 through 21
0.1973 0.5237 0.9182 1.2842 1.5320 1.6009 1.4742
图2.9 微分和积分曲线图
2.6.3卷积和快速傅里叶变换
1. 卷积
卷积和解卷是信号与系统中常用的数学工具。函数conv和deconv分别为卷积和解卷函数,同时也是多项式乘法和除法(2.4.2小节)函数。
? conv:计算向量的卷积。 语法: conv(x,y)
如果x是输入信号,y是线性系统的脉冲过渡函数,则x和y的卷积为系统的输出信号。
? conv2:计算二维卷积。 ? deconv:解卷积运算。 语法:
[q,r]=deconv(x,y)
解卷积和卷积的关系是:x=conv(y,q)+r。
2. 快速傅立叶变换
? fft:一维快速傅立叶变换。 语法: