Matlab 版 (精华区)
发信人: zjliu (秋天的萝卜), 信区: Matlab
标 题: 5.列表
发信站: 哈工大紫丁香 (Sat Apr 24 13:38:45 2004), 站内信件
列表(list)
列表定义
列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以
是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列
表的一个元素也允许是列表。例如:
> rec <- list(name="李明", age=30, scores=c(85, 76, 90))
> rec
$name
[1] "李明"
$age
[1] 30
$scores
[1] 85 76 90
列表元素总可以用“列表名[[下标]]”的格式引用。例如:
> rec[[2]]
[1] 30
> rec[[3]][2]
[1] 76
但是,列表不同于向量,我们每次只能引用一个元素,如rec[[1:2]]的用法是不允许的
。
注意:“列表名[下标]”或“列表名[下标范围]”的用法也是合法的,但其意义与用两
重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果
使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。
在定义列表时如果指定了元素的名字(如rec中的name,age,scores),则引用列表元
素还可以用它的名字作为下标,格式为“列表名[["元素名"]]”,如:
> rec[["age"]]
[1] 30
另一种格式是“列表名$元素名”,如:
> rec$age
[1] 30
其中“元素名”可以简写到与其它元素名能够区分的最短程度,比如“rec$s”可以代表
“rec$score”。这种写法方便了交互运行,编写程序时一般不用简写以免降低程序的
可读性。
使用元素名的引用方法可以让我们不必记住某一个下标代表那一个元素,而直接用易记
的元素名来引用元素。事实上,向量和矩阵也可以指定元素名、行名、列名。
定义列表使用list()函数,每一个自变量变成列表的一个元素,自变量可以用“名字=
值”的方式给出,即给出列表元素名。自变量的值被复制到列表元素中,自变量如果是
变量并不会与该列表元素建立关系(改变该列表元素不会改变自变量的值)。
修改列表
列表的元素可以修改,只要把元素引用赋值即可。如:
> rec$age <- 45
甚至
> rec$age <- list(19, 29, 31)
(可以任意修改一个列表元素)。如果被赋值的元素原来不存在,则列表延伸以包含该
新元素。例如,rec现在共有三个元素,我们定义一个新的命名元素,则列表长度变为4
,再定义第六号元素则列表长度变为6:
> rec$sex <- "男"
> rec[[6]] <- 161
> rec
$name
[1] "李明"
$age
[1] 30
$scores
[1] 85 76 90
$sex
[1] "男"
[[5]]
NULL
[[6]]
[1] 161
第五号元素因为没有定义所有其值是“NULL”,这是空对象的记号。如果rec是一个向量
,则其空元素为“NA”,这是缺失值的记号。从这里我们也可以体会“NULL”与“NA”
的区别。
几个列表可以用连接函数c()连接起来,结果仍为一个列表,其元素为各自变量的列表元
素。如:
> list.ABC <- c(list.A, list.B, list.C)
(注意在S中句点是名字的合法部分,一般没有特殊意义。)
几个返回列表的函数
列表的重要作用是把相关的若干数据保存在一个数据对象中,这样在编写函数时我们就
可以返回这样一个包含多项输出的列表。因为函数的返回结果可以完整地存放在一个列
表中,我们可以继续对得到的结果进行分析,这是S比SAS灵活的一个地方。下面给出几
个返回列表的例子。
一、特征值和特征向量
函数eigen(x)对对称矩阵x计算其特征值和特征向量,返回结果为一个列表,列表的两个
成员(元素)为values和vectors。例如:
> ev <- eigen((1:3) %o% (1:3))
> ev
$values
[1] 1.400000e+001 0.000000e+000-8.881784e-016
$vectors
[,1] [,2] [,3]
[1,] 0.2672612 0.8944272 -0.3585686
[2,] 0.5345225 -0.4472136 -0.7171372
[3,] 0.8017837 0.0000000 0.5976143
可见三个特征值只有第一个不为零(由于数值计算精度所限,第三个特征值应为零但结
果只是近似为零)。特征向量按矩阵存放,每一列为一个特征向量。
二、奇异值分解及行列式
函数svd()进行奇异值分解 ,其中 是任意 阵, 为 正交阵, 为 正交阵, 为 对角阵
(只有主对角线元素不为零)。svd(x) 返回有三个成员d,u,v的列表,d为包含奇异值
的向量(即 的主对角线元素),u,v分别为上面的两个正交阵。
易见如果矩阵x是对称阵则x的行列式的绝对值等于奇异值的乘积,所以:
> absdetx <- prod(svd(x)$d)
或者我们可以为此定义一个函数:
> absdet <- function(x) prod(svd(x)$d)
三、最小二乘拟合与QR分解
函数lsfit(x,y)返回最小二乘拟合的结果。最小二乘的模型为线性模型
lsfit(x,y)的第一个参数x为模型中的设计阵 ,第二个参数y为模型中的因变量y(可以
是一个向量也可以是一个矩阵),返回一个列表,成员coefficients为上面模型的 (最
小二乘系数),成员residuals为拟合残差,成员intercept用来指示是否有截距项,成
员qr为设计阵 的QR分解,它本身也是一个列表。模型拟合缺省情况有截距项,可以用in
tercept=FALSE选项指定无截距项。关于最小二乘拟合还可参见ls.diag() 函数(查看帮
助)。
函数qr(x)返回x的QR分解结果。矩阵 的QR分解为 , 为对角线元素都等于1的下三角阵
, 为上三角阵。函数结果为一个列表,成员qr 为一个矩阵,其上三角部分(包括对角
线)分解的 ,其下三角部分(不包括对角线)为分解的 。其它成员为一些辅助信息。
--
╔═══════════════════╗
║★★★★★友谊第一 比赛第二★★★★★║
╚═══════════════════╝
※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 202.118.229.162]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.990毫秒