R中数组,矩阵与二维数组的区别,数据框有什么区别

博客访问: 397059
博文数量: 87
博客积分: 1437
博客等级: 上尉
技术积分: 810
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
第五讲计算结果的可视化
本节介绍MATLAB 的两种基本绘图功能:二维平面图形和三维立体图形。
5.1 二维平面图形
5.1.1 基本图形函数
plot 是绘制二维图形的最基本函数,它是针对向量或矩阵的列来绘制曲线的。也就是
说,使用plot 函数之前,必须首先定义好曲线上每一点的x 及y 坐标,常用格式为:
(1)plot(x) 当x 为一向量时,以x 元素的值为纵坐标,x 的序号为横坐标值绘制
曲线。当x 为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲
当x 为m× n 矩阵时,就由n 条曲线。
(2)plot(x,y) 以x 元素为横坐标值,y 元素为纵坐标值绘制曲线。
(3)plot(x,y1,x,y2,…) 以公共的x 元素为横坐标值,以y1,y2,… 元素为纵坐标值绘
制多条曲线。
例5.1.1 画出一条正弦曲线和一条余弦曲线。
>> x=0:pi/10:2*
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,x,y2)
图5.1.1 函数plot 绘制的正弦曲线
在绘制曲线图形时,常常采用多种颜色或线型来区分不同的数据组,MATLAB 软件专
门提供了这方面的参数选项(见表5.1.1),我们只要在每个坐标后加上相关字符串,就可
现它们的功能。
表5.1.1 绘图参数表
色彩字符颜色线型字符线型格式标记符号数据点形式标记符号数据点形式
y 黄- 实线. 点< 小于号
m 紫: 点线o 圆s 正方形
c 青-. 点划线x 叉号d 菱形
r 红- - 虚线+ 加号h 六角星
g 绿* 星号p 五角星
b 蓝v 向下三角形
w 白^ 向上三角形
k 黑> 大于号
例如,在上例中输入
>> plot(x,y1,'r+-',x,y2,'k*:')
则得图5.1.2
图5.1.2 使用不同标记的plot 函数绘制的正弦曲线
5.1.2 图形修饰
MATLAB 软件为用户提供了一些特殊的图形函数,用于修饰已经绘制好的图形。
表5.1.2 图形修饰函数表
grid on (/off) 给当前图形标记添加(取消)网络
xlable(‘string’) 标记横坐标
ylabel(‘string’) 标记纵坐标
title(‘string’) 给图形添加标题
text(x,y,’string’) 在图形的任意位置增加说明性文本信息
gtext(‘string’) 利用鼠标添加说明性文本信息
axis([xmin xmax ymin ymax]) 设置坐标轴的最小最大值
例5.1.2 给例5.1.1 的图形中加入网络和标记。(见图5.1.3 和5.1.4)
>> x=0:pi/10:2*
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,x,y2)
>> grid on
>> xlabel('independent variable X')
>> ylabel('Dependent Variable Y1 & Y2')
>> title('Sine and Cosine Curve')
>> text(1.5,0.3,'cos(x)')
>> gtext('sin(x)')
>> axis([0 2*pi -0.9 0.9])
图5.1.3 使用了图形修饰的plot 函数绘制的正弦曲线
5.1.3 图形的比较显示
在一般默认的情况下,MATLAB 每次使用plot 函数进行图形绘制,将重新产生一个图
形窗口。但有时希望后续的图形能够和前面所绘制的图形进行比较。一般来说有两种方法
一是采用hold on(/off)命令,将新产生的图形曲线叠加到已有的图形上;二是采用
subplot(m,n,k)函数,将图形窗口分隔成n m× 个子图,并选择第k 个子图作为当前图形
后在同一个视图窗口中画出多个小图形。
例5.1.3 在同一窗口中绘制线段。(见图5.1.5)
>> x=0:pi/10:2*
>> y1=sin(x);
>> y2=cos(x);
>> y4=log(x);
>> plot(x,y1,x,y2)
>> hold on
>> plot(x,y3)
>> plot(x,y4)
>> hold off
例5.1.4 在多个窗口中绘制图形。(见图5.1.6)
>> x=0:pi/10:2*
>> y1=sin(x);
>> y2=cos(x);
>> y3=exp(x);
>> y4=log(x);
>> subplot(2,2,1);
>> plot(x,y1);
>> subplot(2,2,2);
>> plot(x,y2);
>> subplot(2,2,3);
>> plot(x,y3);
>> subplot(2,2,4);
>> plot(x,y4);
[说明] (1)子窗口的序号按行由上往下,按列从左向右编号。
(2)如果不用指令clf 清除,以后图形将被绘制在子图形窗口中。
图5.1.4 设置坐标轴最大最小值的正弦曲线
图5.1.5 图形的比较显示(曲线叠加方法)
图5.1.6 图形的比较显示(图形窗口分割方法)
5.2 三维立体图形
5.2.1 三维曲线图
与二维图形相对应,MATLAB 提供了plot3 函数,可以在三维空间中绘制三维曲线,
它的格式类似于plot,不过多了z 方向的数据。plot3 的调用格式为:
plot3(x1,y1,z1,x2,y2,z2,...)
其中x1,y1,z1,x2,y2,z2,…等分别为维数相同的向量,分别存储着曲线的三个坐标值,该
的使用方式和plot 类似,也可以采用多种的颜色或线型(见表5.1.1)来区分不同的数据
只需在每组变量后面加上相关字符串即可实现该功能。
例5.2.1 绘制方程x=t
&&&&&&&&&&&&&&&&y=sin(t)
&&&&&&&&&&&&&&&&z=cos(t)
在t=[0,2*pi]上
的空间方程。(见图5.2.1)
>> x=0:pi/10:2*
>> y1=sin(x);
>> y2=cos(x);
>> plot3(y1,y2,x,'m:p')
>> grid on
>> xlabel('Dependent Variable Y1')
>> ylabel('Dependent Variable Y2')
>> zlabel('Independent Variable X')
>> title('Sine and Cosine Curve')
图5.2.1 函数plot 绘制的三维曲线图
5.2.2 三维曲面图
如果要画一个三维的曲面,可以使用mesh(X,Y,Z)或surf(X,Y,Z)函数来实现。
mesh 函数为数据点绘制网格线,图形中的每一个已知点和其附近的点用直线连接。surf
函数和mesh 的用法类似,但它可以画出着色表面图,图形中的每一个已知点与其相邻点以
平面连接。
为方便测试立体绘图,MATLAB 提供了一个peaks 函数,它可以产生一个的高
斯分布矩阵,其生成方程是
z=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-1/3*ex
p(-(x+1).^2-y.^2)
对应的图形是一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点。
下面使用peaks 函数来比较一下mesh 和surf 的区别。
例5.2.2 分别用mesh 函数和surf 函数绘制高斯矩阵的曲面。
>> z=peaks(40);
>> mesh(z);
>> surf(z);
图5.2.2 mesh 函数绘制的三维曲面图
图5.2.3 surf 函数绘制的着色表面图
在曲面绘图中,另一个常用的函数是meshgrid 函数,其一般引用格式是:
[X, Y]=meshgrid (x, y)
其中x 和y 是向量,通过meshgrid 函数就可将x 和y 指定的区域转换成为矩阵X 和Y。
这样我们在绘图时就可以先用meshgrid 函数产生在x-y 平面上的二维的网格数据,再以一
组z 轴的数据对应到这个二维的网格,即可画出三维的曲面。
例5.2.3 绘制方程
&&&&&sin((x^2+y^2)^(1/2))
z = ---------------------
&&&&&&&&(x^2+y^2)^(1/2)
在x∈[-7.5,7.5];y∈[-7.5,7.5] 的图形。
>> x=-7.5:0.5:7.5;y=x;
>> [X,Y]=meshgrid(x,y);
>> R=sqrt(X.^2+Y.^2)+
>> Z=sin(R)./R;
>> surf(X,Y,Z)
>> xlabel('X 轴方向')
>> ylabel('Y 轴方向')
>> zlabel('Z 轴方向')
(见图5.2.4)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_(x^2+y^2)
例5.2.4 绘制由方程形成的立体图。(见图5.2.5) z=xe
>> x=-2:0.1:2;y=x;
>> [X,Y]=meshgrid(x,y);
>> Z=X.*exp(-X.^2-Y.^2);
>> surf(X,Y,Z)
5.2.3 观察点
MTALAB 允许用户设置观察点,其指令是: view(azimuth,elevation)
其中方位角azimuth 是观察点和坐标原点连线在x-y 平面的投影和y 轴负方向的夹角,仰
elevation 是观察点与坐标原点的连线和x-y 平面的夹角。对于这两个角度,三维图形的
值分别是-37.5 和30,二维图形的默认值是0 和90。
例5.2.5 从不同的角度观察高斯矩阵的曲面。
>> z=peaks(40);
>> subplot(2,2,1);
>> mesh(z);
>> subplot(2,2,2);
>> mesh(z);
>> view(-37.5,-30);
>> subplot(2,2,3);
>> mesh(z);
>> view(180,0);
>> subplot(2,2,4);
>> mesh(z);
>> view(0,90);
图5.2.6 对应不同观察点的三维曲面图
5.3 其他图形函数
除了plot 绘图函数以外,在有些场合对绘制的曲线会有一些特殊要求,这就要其他函
数来实现,常用的几种函数如下(见表5.3.1)
表5.3.1 其他图形函数表
loglog 使用对数坐标系绘图
semilogx 横坐标为对数坐标轴,纵坐标为线性坐标轴
semilogy 横坐标为线性坐标轴,纵坐标为对数坐标轴
polar 绘制极坐标图
fill 绘制实心图
bar 绘制直方图
pie 绘制饼图
area 绘制面积图
quiver 绘制向量场图
stairs 绘制阶梯图
sterm 绘制火柴杆图
>> x=0:pi/10:2*
>> y1=sin(x);
>> subplot(2,2,1);
>> plot(x,y1);
>> subplot(2,2,2);
>> bar(x,y1);
>> subplot(2,2,3);
>> fill(x,y1,'g');
>> subplot(2,2,4);
>> stairs(x,y1,'k');
图5.3.1 其他图形函数
5.3.1 直方图
函数bar(x)可以绘制直方图,这对统计或者数据采集非常直观实用。它共有四种形式:
bar,bar3,barh 和bar3h,其中bar 和bar3 分别用来绘制二维和三维竖直方图,barh 和b
别用来绘制二维和三维水平直方图,调用格式是:
bar(x,y) 其中x 必须单调递增或递减,y 为n m× 矩阵,可视化结果为m 组,每
组n 个垂直柱,也就是把y 的行画在一起,同一列的数据用相同的颜色表示;
bar(x,y,width) (或bar(y,width))指定每个直方条的宽度,如width>1,则直方条会重
叠,默认值为width=0.8;
bar(…,’grouped’) 使同一组直方条紧紧靠在一起;
bar(…,’stack’) 把同一组数据描述在一个直方条上。
>> y=[5 3 2 9;4 7 2 7;1 5 7 3];
>> subplot(2,2,1),bar(y)
>> x=[5 9 11];
>> subplot(2,2,2),bar3(x,y)
>> subplot(2,2,3),bar(x,y,'grouped')
>> subplot(2,2,4),bar(rand(2,3),.75,'stack')
图5.3.2 直方图
5.3.2 面积图
函数area 用来绘制面积图,面积图在plot 的基础上填充x 轴和曲线之间的面积,该图
用于查看某个数在该列所有数的总和中所占的比例。
>> x=-3:3;
>> y=[3 2 5;6 1 8;7 4 9;6 3 7;8 2 9;4 2 9;3 1 7];
>> area(x,y)
图5.3.3 面积图
5.3.3 饼图
函数pie 用来绘制饼图,它可以形象地表示出向量中各元素所占比例。其调用格式是:
pie(x) x 中的元素通过x/sum(x)进行归一化,以确定饼图中的份额;
pie(x,explode) 向量explode 和x 元素数相同,用来指出需要分开的饼片,explode 中
不为零的部分会被分开。
图5.3.4 饼图
例5.3.4 设某班的某课程的考试成绩如下:90 分以上有32 人,81 至90 有58 人,71
至80 分有27 人,60 至70 分为21 人,60 分以下有16 人,画出饼图。(见图5.3.4)
>> x=[32 58 27 21 16];
>> explode0=[1 0 0 0 0];
>> subplot(1,2,1)
>> pie(x,explode0)
>> explode1=[0 0 0 0 1];
>> subplot(1,2,2)
>> pie(x,explode1)
5.3.4 不同坐标系中的绘图
Semilogx,semilogy,loglo,polar(theta,rho)的使用方法和plot 完全类似,不同的只是绘
不同的图形坐标上。函数semilogx 绘制x 轴为对数标度的图形,在半对数坐标系中绘图;
函数semilogy 绘制y 轴为对数标度的图形;函数loglog 绘制两个轴都为对数间隔的图形
函数polar(theta,rho)绘制极坐标图形,其中theta 为相角,rho 为其对应的半径。
例5.3.5 绘制ρ=acos(3θ),a=2 的图形。(见图5.3.5)
>> theta=-pi:pi/80:
>> polar(theta,2*cos(3*theta))
图5.3.5 极坐标图
5.4 符号表达式绘图
MATLAB 软件提供了将表达式进行图形显示的功能。完成此功能需调用fplot 函数和
ezplot 函数。
函数fplot 用来绘制数学函数,其调用格式为: fplot(fun,lims)
其中fun 就是所要绘制的函数,可以是定义函数的M 文件名,也可以是以x 为变量的可计
算字符串。例如’diric(x,10)’或’[sin(x),cos(x)]’,对于向量x 的每个元素,函数
fun(x)必须返
回一个行向量。如果fun 返回[f1(x),f2(x),f3(x)],输入[x1;x2],就会返回矩阵
f1(x1) f2(x1) f3(x1)
f1(x2) f2(x2) f3(x2)
lims=[XMIN XMAX YMIN YMAX]限定了x,y 轴上的绘图空间。
>> subplot(2,2,1),fplot('humps',[0 1])
>> subplot(2,2,2),fplot('abs(exp(-j*x*(0:9))*ones(10,1))',[0 2*pi])
>> subplot(2,2,3),fplot('[tan(x),sin(x),cos(x)]',2*pi*[-1 1 -1 1])
>> subplot(2,2,4),fplot('sin(1./x)',[0.01 0.1],1e-3)
图5.4.1 fplot 函数绘制表达式图形
ezplot 函数是简捷绘图指令之一,它无需数据准备,直接画出函数图形,基本调用格式
为ezplot(f)
其中f 是字符串或代表数学函数的符号表达式,只有一个符号变量,可以是x,缺省情况下
x 轴的绘图区域为] 2 , 2 [ π π ? ,但我们可以用ezplot(f,xmin,xmax)或ezp
lot(f,[xmin,xmax])来指
定x 的范围。
>> y='x^2';
>> subplot(1,2,1)
>> ezplot(y)
>> subplot(1,2,2)
>> y='sin(x)';
>> ezplot(y,[-pi,pi])
图5.4.2 ezplot 函数绘制表达式图形
5.5 plot 函数
MATLAB 对数据是按列存储和计算的,运用plot(x)时,当x 为一个向量时,以其元
素为纵坐标,其序号为横坐标值绘制曲线。当x 为实矩阵时,则以其序号为横坐标,按列
制每列元素相对于序号的曲线,当x 为n m× 矩阵时,就有n 条曲线。
如果x,y 是同维向量,plot(x,y)指令以x 元素为横坐标值,y 元素为纵坐标值绘制曲线。
如x 是向量,y 是有一维与x 元素数量相等的矩阵,则以x 为共同横坐标,按列绘制y 每
元素值,曲线数为y 的另一维的元素数。如果x,y 是同维矩阵,则以x,y 对应列元素为、
坐标分别绘制曲线,数目等于矩阵的列数。
>> x=[3 5 10 8];
>> subplot(2,2,1)
>> plot(x)
>> x=[3 5 10 8;7 2 9 4;2 7 2 7]';
>> subplot(2,2,2)
>> plot(x)
>> x=[3 5 6 8];
>> y=[1 5 10 4];
>> subplot(2,2,3)
>> plot(x,y)
>> x=[1 3 5 7;2 4 6 8]';
>> y=[6 2 5 10;3 5 2 6]';
>> subplot(2,2,4)
>> plot(x,y,'k:*')
5.6 交互式图形指令
ginput 是一个比较特殊的图形指令,用作获取图上数据,例如指令
>>[x,y]=ginput(6) % 从图形上选取6 个点
此时,ginput 指令将把当前图形调入前台,同时光标变为十字叉,移动光标,使交叉点落
目标点上,单击鼠标,即可获得该点数据。
>> fplot('humps',[0 1])
>> ginput(6)
阅读(201616) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。1994人阅读
在读R Document的时候经常会出现array这个词。array字面上很好理解,数组,但是数组跟矩阵、跟数据框(包括向量)有什么区别呢?
-&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;-
在C语言里(R就是基于C写出来的)也有数组这个概念,它是具有相同数据类型按一定次序排列的一组变量的集合体。在R里,array是这样定义的:
An array in R can have one, two or more dimensions. It is simply a vector which is stored with additional attributes giving the dimensions (attribute &dim&) and optionally names for those dimensions (attribute &dimnames&).
这段是说,如果你&#30524;前的数据,不管是一维还是二维还是多维,如果有dim这个attribute,就可以算作一个数组(其实是有例外的)。先看几个例子帮助理解:
& # for a vector
& c &- b &- a &- 1:24
& is.vector(a)
& is.array(a) & & # a simple vector is not an array
& dim(a) &- 24
[1]& 1& 2& 3& 4& 5& 6& 7& 8& 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
& dim(b) &- c(4, 6)
& dim(c) &- 2:4
& sapply(list(a,b,c),is.array) & & # with the dimension(s), a vector becomes array
[1] TRUE TRUE TRUE
& sapply(list(a,b,c),is.matrix) & & # a vector with 2 dimensions is a matrix
[1] FALSE &TRUE FALSE
从上面的例子可以得出关于R语言中array的四个结论:
一个简单赋&#20540;的vector(atomic vector,通常用c()创建)不是array;只要添加dimension,vector就是个array;&添加了一个dimension的vector跟没有添加dimension的vector在数据结构上是一样的,但是只有前者是一个array;一个2维的vector等价于一个matrix。matrix是array在2维数据上的特殊表现形式。
那么array和data.frame的关系呢?互不相认,因为array必须是一个均匀的数据结构,二位以上的array每个元素的长度应该相等,每个元素的数据类型也应该是一致的。而data.frame和list不满足这两点要求,前者是因为可以储存多种变量类型,后者是因为可储存不同长度以及不同类型的数据。所以在R里,不管一组数据是不是均匀架构,只要它的class是data.frame或者list,R都会将它排除在array的定义之外。
& class(mtcars)
[1] &data.frame&
& m &- as.matrix(mtcars)
& is.array(class)
& is.array(m)
& l &- as.list(mtcars)
& is.array(l)
-&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;--&#43;-
综上所述,array是一种数据结构,可简单理解为拥有dimension的vector(可以是1,2,...,n个维度)。它最常见的用法就是做为matrix去进行统计运算。data frame不能简单的理解为matrix,更不是一个array。
array作为一个概念经常出现在R Document中,对于没有IT背景的人(比如说我)来说刚开始看到的时候略航乱。其实在不同维度数量上(最常用的是1d和2d),我们可以找到分别对应的数据结构去进行替换和理解思考,以后见到就没那么惊悚了。
另外有个题外话,R里没有标量(Scalar)的概念。上面提到的没有dimension的vector有点类&#20284;scalar。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:37274次
排名:千里之外
原创:35篇
(4)(5)(1)(3)(5)(3)(7)(1)(2)(4)(1)(2)(3)&&/&&&&/&&
一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本节只介绍二维数组,多维数组可由二维数组类推而得到。
二维数组的定义
二维数组定义的一般形式是:
& & 类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:
int a[3][4];
说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3&4个,即:
& & a[0][0], a[0][1], a[0][2], a[0][3]
&&& a[1][0], a[1][1], a[1][2], a[1][3]
&&& a[2][0], a[2][1], a[2][2], a[2][3]
二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。
在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。
二维数组元素的引用
二维数组的元素也称为双下标变量,其表示的形式为:
& & 数组名[下标][下标]
其中下标应为整型常量或整型表达式。例如:
& & a[3][4]
表示a数组三行四列的元素。
下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。
【例7-6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:
#include &stdio.h&
int main(void){
int i,j,s=0,average,v[3],a[5][3];
printf(&input score\n&);
for(i=0;i&3;i++){
for(j=0;j&5;j++){
scanf(&%d&,&a[j][i]);
s=s+a[j][i];
average =(v[0]+v[1]+v[2])/3;
printf(&math:%d\nc languag:%d\ndbase:%d\n&,v[0],v[1],v[2]);
printf(&total:%d\n&, average );
程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0]、v[1]、v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。
二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。
例如对数组a[5][3]:
按行分段赋值可写为:
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行连续赋值可写为:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
这两种赋初值的结果是完全相同的。
【例7-7】求各科平局分和总成绩平均分。
#include &stdio.h&
int main(void){
int i,j,s=0, average,v[3];
int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
for(i=0;i&3;i++){
for(j=0;j&5;j++)
s=s+a[j][i];
average=(v[0]+v[1]+v[2])/3;
printf(&math:%d\nc languag:%d\ndFoxpro:%d\n&,v[0],v[1],v[2]);
printf(&total:%d\n&, average);
对于二维数组初始化赋值还有以下说明:
1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:
int a[3][3]={{1},{2},{3}};
是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:
& & 1 &0 &0
& & 2 &0 &0
& & 3 &0 &0
int a [3][3]={{0,1},{0,0,2},{3}};
赋值后的元素值为:
& & 0 &1 &0
& & 0 &0 &2
& & 3 &0 &0
2) 如对全部元素赋初值,则第一维的长度可以不给出。例如:
int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为:
int a[][3]={1,2,3,4,5,6,7,8,9};
3) 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。
如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:
对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。
推荐文章 TOP10【R语言系列】R语言中矩阵运算
【R语言系列】R语言中矩阵运算
发布时间: 18:44:43
编辑:www.fx114.net
本篇文章主要介绍了"【R语言系列】R语言中矩阵运算",主要涉及到【R语言系列】R语言中矩阵运算方面的内容,对于【R语言系列】R语言中矩阵运算感兴趣的同学可以参考一下。
R语言中矩阵运算
1_矩阵的生成
2_矩阵的四则运算
3_矩阵的矩阵运算
4_矩阵的分解
1_1将向量定义成数组
& & &向量只有定义了维数向量(dim属性)后才能被看作是数组.比如:
& dim(z)=c(3,4);
& & &[,1] [,2] [,3] [,4]
[1,] & &1 & &4 & &7 & 10
[2,] & &2 & &5 & &8 & 11
[3,] & &3 & &6 & &9 & 12
& & 注意:生成矩阵是按列排列的。
1_2用array ( )函数构造多维数组
& & & 用法为:array(data=NA,dim=length(data),dimnames=NULL)
& & & & & & 参数描述:data:是一个向量数据。
& & & & & & & & & & & dim:是数组各维的长度,缺省时为原向量的长度。
& & & & & & & & & & & dimname:是数组维的名字,缺省时为空。
& x=array(1:20,dim=c(4,5))
& & &[,1] [,2] [,3] [,4] [,5]
[1,] & &1 & &5 & &9 & 13 & 17
[2,] & &2 & &6 & 10 & 14 & 18
[3,] & &3 & &7 & 11 & 15 & 19
[4,] & &4 & &8 & 12 & 16 & 20
1_3用matrix()函数构造矩阵
& & 函数matrix)是构造矩阵(二维数组)的函数,其构造形式为
& & matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)
& & 其中data是一个向量数据,nro、是矩阵的行数,ncol是矩阵的列数.当byrow=TRUE时,生成矩阵的数据按行放置,缺省时相当于byrow=FALSE,数据按列放置.dimname。是数组维的名字,缺省时为空.
& & 如构造一个3x5阶的矩阵
& A=matrix(1:15,nrow=3,byrow=TRUE)
& & &[,1] [,2] [,3] [,4] [,5]
[1,] & &1 & &2 & &3 & &4 & &5
[2,] & &6 & &7 & &8 & &9 & 10
[3,] & 11 & 12 & 13 & 14 & 15
2_矩阵的四则运算
& & &可以对数组之间进行四则运算(&#43;、一、*、/),这时进行的是数组对应元素的四则运算。一般情况下参加运算的矩阵或者数组的维数是相同的,但也可以计算不同维的,这是要将对应的元素补足。
3_1 &转置运算
& & 对于矩阵A,函数t(A)表示矩阵A的转置,如:
& A=matrix(1:6,nrow=2);
& & &[,1] [,2] [,3]
[1,] & &1 & &3 & &5
[2,] & &2 & &4 & &6
& & &[,1] [,2]
[1,] & &1 & &2
[2,] & &3 & &4
[3,] & &5 & &6
3_2 求方阵的行列式
& & &函数det()是求矩阵行列式的&#20540;,如
& det(matrix(1:4,ncol=2));
3_3 向量的内积
& & 对于n维向量x,可以看成nxl阶矩阵或lxn阶矩阵。若x与y是相同
维数的向量,则x%*%Y表示x与y作内积.例如,
&x=1:5; Y=2*1:5
& & & [,1]
& & 函数crossprod()是内积运算函数(表示交叉乘积),crossprod(x,y)计算向量x与y的内积,即t(x) %*% y'。crossprod(x)表示x与x的内积.
& & 类&#20284;地,tcrossprod(x,y)表示’x%*%t(Y)’,即x与y的外积,也称为叉积。tcrossprod(x)表示x与x作外积.如:
& x=1:5; y=2*1:5;
& crossprod(x);
& crossprod(x,y);
& tcrossprod(x);
& & &[,1] [,2] [,3] [,4] [,5]
[1,] & &1 & &2 & &3 & &4 & &5
[2,] & &2 & &4 & &6 & &8 & 10
[3,] & &3 & &6 & &9 & 12 & 15
[4,] & &4 & &8 & 12 & 16 & 20
[5,] & &5 & 10 & 15 & 20 & 25
& tcrossprod(x,y);
& & &[,1] [,2] [,3] [,4] [,5]
[1,] & &2 & &4 & &6 & &8 & 10
[2,] & &4 & &8 & 12 & 16 & 20
[3,] & &6 & 12 & 18 & 24 & 30
[4,] & &8 & 16 & 24 & 32 & 40
[5,] & 10 & 20 & 30 & 40 & 50
3_4 &向量的外积(叉积)
设x和y是n维向量,则x%o%y表示x与y作外积.例如
& & &[,1] [,2] [,3] [,4] [,5]
[1,] & &2 & &4 & &6 & &8 & 10
[2,] & &4 & &8 & 12 & 16 & 20
[3,] & &6 & 12 & 18 & 24 & 30
[4,] & &8 & 16 & 24 & 32 & 40
[5,] & 10 & 20 & 30 & 40 & 50
& & & outer()是更为强大的外积运算函数,outer(x,y)计算向量二与y的外积,它等价于x %o%y
函数。outer()的一般调用&#26684;式为
& & & outer(x,y,fun=”*”)
& & &其中x, y矩阵(或向量),fun是作外积运算函数,缺省&#20540;为乘法运算。函数outer()在绘制三维曲面时非常有用,它可生成一个x和y的网&#26684;。
3_5 &矩阵的乘法
& & 设A和B为两个矩阵,通常意义下的矩阵乘法是通过A%*%B来完成,crossprod(A,B)表示的是
t(A)%*%B,而tcrossprod(A,B)表示的是A%*%t(B)。最后我们通过运算知道x%*%A%*%x为二次型。
& A=array(1:9,dim=(c(3,3)))
& B=array(9:1,dim=(c(3,3)))
& & &[,1] [,2] [,3]
[1,] & 90 & 54 & 18
[2,] &114 & 69 & 24
[3,] &138 & 84 & 30
& crossprod(A,B)==t(A)%*%B;
& & &[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
& tcrossprod(A,B)==A%*%t(B);
& & &[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE
3_6 生成对角阵和矩阵取对角运算
& & 函数diag()依赖于它的变量,当v是一个向量时,diag(v)表示以v的元素为对角线元素的对角阵.当M是一个矩阵时,则diag(M)表示的是取M对角线上的元素的向量.如
& v=c(1,4,5);
& diag(v);
& & &[,1] [,2] [,3]
[1,] & &1 & &0 & &0
[2,] & &0 & &4 & &0
[3,] & &0 & &0 & &5
& M=array(1:9,dim=c(3,3));
& diag(M);
3_7 解线性方程组和求矩阵的逆矩阵
& & 若求解线性方程组Ax=b,其命令形式为solve(A,b),求矩阵A的逆,其命令形式为solve(A).设矩阵A=t(array(c(1:8,10),dim=c(3,3))),b&-c(1,1,1),则解方程组Ax=b的解x和求矩阵A的逆矩阵的命令如下:
& A=t(array(c(1:8,10),dim=c(3,3)));
& b=c(1,1,1);
& x=solve(A,b);
[1] -1.000000e&#43;00 &1.000000e&#43;00 &3.
& solve(A);
& & & & & &[,1] & & &[,2] [,3]
[1,] -0..333333 & &1
[2,] -0..666667 & -2
[3,] &1..000000 & &1
3_8 求矩阵的特征&#20540;与特征向量
& & 函数eigen(Sm)是求对称矩阵Sm的特征&#20540;与特征向量,其命令形式为:ev=eigen(Sm),则ev存放着对称矩阵Sm特征&#20540;和特征向量,是由列表形式给出的,其中ev$values是Sm的特征&#20540;构成的向量,ev$vectors是Sm的特征向量构成的矩阵.如
& Sm=crossprod(A,A);
& ev=eigen(Sm);
[1] 303. & 0. & 0.
& & & & & &[,1] & & & & [,2] & & & [,3]
[1,] -0.. &0.2995295
[2,] -0.. -0.8326258
[3,] -0.. &0.4658502
4_1 特征&#20540;分解
(1).定义:
& & 对N阶方阵A,x为标量,v是非零的N维列向量,且满足Ax=xv ,则称x为矩阵A的特征&#20540;,v 是相对应于x 的特征向量。特征&#20540;的全体成为A的谱。
(2).在r中的实现:在r中利用函数eigen(A)来求矩阵的特征&#20540;和特征向量,具体的调用&#26684;式为:
以矩阵A为例说明此问题
& A=array(c(1,1,1,4,2,1,9,3,1),dim=c(3,3));
& D=eigen(A);
[1] &5...1715729
& & & & & &[,1] & & & & &[,2] & & & [,3]
[1,] -0.. &0.5384820
[2,] -0.. -0.7872938
[3,] -0.. &0.3003425
(3).特征&#20540;分解的性质:我们知道当所求的的特征向量构成的矩阵可逆时会满足solve(vectors)%*%A%*%vectors=diag(values),下面进行验证。
& solve(vectors)%*%A%*%
& & & & & & & [,1] & & & & &[,2] & & & & &[,3]
[1,] &5.828427e&#43;00 &8. -1.
[2,] &1. -2.000000e&#43;00 &2.
[3,] -3. -1. &1.
结果的精度还是比较高的。
4_2 矩阵的奇异&#20540;分解
& & 函数svd(A)是对矩阵A作奇异&#20540;分解,即A =U%*%D%*%t(V),其中U, V是正交阵,D为对角阵,也就是矩阵A的奇异&#20540;.svd(A)的返回&#20540;也是列表,svd(A)$d表示矩阵A的奇异&#20540;,即矩阵D的对角线上的元素.svd(A)$u对应的是正交阵U, svd(A) $v对应的是正交阵V.例如,
& A&-t(array(c(1:8,10),dim=c(3,3)))
& SVD=svd(A);
[1] 17...1968665
& & & & & &[,1] & & & &[,2] & & & [,3]
[1,] -0...1616762
[2,] -0...8630696
[3,] -0...4785099
& & & & & &[,1] & & & & [,2] & & & [,3]
[1,] -0.. &0.2995295
[2,] -0.. -0.8326258
[3,] -0.. &0.4658502
& attach(SVD);
The following object(s) are masked from 'SVD (position 3)':
& & d, u, v
& u%*%diag(d)%*%t(v);
& & &[,1] [,2] [,3]
[1,] & &1 & &2 & &3
[2,] & &4 & &5 & &6
[3,] & &7 & &8 & 10
& & &[,1] [,2] [,3]
[1,] & &1 & &2 & &3
[2,] & &4 & &5 & &6
[3,] & &7 & &8 & 10
4_3 qr分解
& & 设A为m*n矩阵,如果存在m*m酉矩阵Q(即Q(H)Q=QQ(H)=I)和m*n阶梯形矩阵R,使得A=QR,那么此分解称为QR分解。QR分解在解决最小二乘问题、特征&#20540;计算等方面有着十分重要的作用。
& A=(array(c(1:12),dim=c(4,3)));
& & &[,1] [,2] [,3]
[1,] & &1 & &5 & &9
[2,] & &2 & &6 & 10
[3,] & &3 & &7 & 11
[4,] & &4 & &8 & 12
#进行矩阵分解
& QR=qr(A);QR
& & & & & &[,1] & & & &[,2] & & & & &[,3]
[1,] -5...008316e&#43;01
[2,] &0.3651484 &-3..531973e&#43;00
[3,] &0.5477226 &-0..
[4,] &0.7302967 &-0..
[1] 1...373098
attr(,&class&)
#提取Q,R并验证分解的正确性。
& Q=qr.Q(QR);
& R=qr.R(QR);
& & &[,1] [,2] [,3]
[1,] & &1 & &5 & &9
[2,] & &2 & &6 & 10
[3,] & &3 & &7 & 11
[4,] & &4 & &8 & 12
4_4 Schur分解
& & 从特征&#20540;的分解中可以看出,特征&#20540;的分解是有条件的,如果特征向量不是线性无关的,那么对于一个矩阵来说便不能采用特征&#20540;分解的方法对矩阵进行分解。例如对于矩阵A=t(array(c(6,12,19,-9,-20,-33,4,9,15),dim=c(3,3))进行特征&#20540;分解有:
& A=t(array(c(6,12,19,-9,-20,-33,4,9,15),dim=c(3,3)));
& & &[,1] [,2] [,3]
[1,] & &6 & 12 & 19
[2,] & -9 &-20 &-33
[3,] & &4 & &9 & 15
& W=eigen(A);
[1] &1&#43;0i &1-0i -1&#43;0i
& & & & & & & [,1] & & & & &[,2] & & & & &[,3]
[1,] -0.i -0.;0i -0.;0i
[2,] &0.;0i &0.;0i &0.;0i
[3,] -0.;0i -0.i -0.;0i
& attach(W);
The following object(s) are masked from 'W (position 3)':
& & values, vectors
& det(vectors);
错误于determinant.matrix(x, logarithm = TRUE, ...) :
& 目前还不能算复数矩阵的行列式
& det(Re(vectors));
& solve(vectors)
& & & & & & & & & &[,1] & & & & & & & [,2] & & & & & & & &[,3]
[1,] 0.;i &0.009959i &-9.209959i
[2,] 0.09959i &0.59i &-9.59i
[3,] 3.; & & & 0i 11.07362&#43; & & & 0i &18.45603&#43; & & & 0i
& & 很明显vectors不是一个可逆矩阵此时进行特征&#20540;分辨这种方法便不可行,对于这种情况我们可以作Schur分解。
& & 对于任意的方针A,其Schur分解的形式为:A=USU(H),其中U是标准的正交矩阵(即满足UU(H)=I),S为上三角矩阵,并且对角线上的元素为A的特征&#20540;。由于此函数在包Matrix中,所以使用之前必须调入。并且注意matrix和Matrix的区别。
& A=Matrix(c(6,12,19,-9,-20,-33,4,9,15),ncol=3,byrow=TRUE);
3 x 3 Matrix of class &dgeMatrix&
& & &[,1] [,2] [,3]
[1,] & &6 & 12 & 19
[2,] & -9 &-20 &-33
[3,] & &4 & &9 & 15
& library(Matrix);
& Sch=Schur(A, vectors=TRUE);
& Q=as.matrix(Q)
& attach(Sch);
错误于attach(Sch) : 'attach'只适用于串列,数据框和环境
& Q%*%T%*%t(Q)
3 x 3 Matrix of class &dgeMatrix&
& & &[,1] [,2] [,3]
[1,] & &6 & 12 & 19
[2,] & -9 &-20 &-33
[3,] & &4 & &9 & 15
4_5 &Cholesky分解(柯利分解)
& & 正定矩阵:设A是n阶实系数矩阵, 如果对任何非零向量 X=(x1,...xn) 都有
t(X)AX&0,就称A正定(Positive Definite)。正定矩阵在相合变换下可化为标准型, 即单位矩阵。
Cholesky分解:
& & 对任意的正定矩阵A,存在上三角矩阵R,使A=t(R)%*%R,则称为A的Cholesky分解(柯利分解)。
& #输入矩阵
& m=matrix(c(5,1,1,3),ncol=2 );
& & &[,1] [,2]
[1,] & &5 & &1
[2,] & &1 & &3
& #矩阵分解
& CH=chol(m);
& #验证结果
& t(CH)%*%CH;
& & &[,1] [,2]
[1,] & &5 & &1
[2,] & &1 & &3
本文标题:
本页链接:

我要回帖

更多关于 数组 矩阵 区别 的文章

 

随机推荐