找回密码
 立即注册
查看: 3462|回复: 0

[问题求助]请教x%*%t怎么用的问题(已经解决,)

[复制链接]
发表于 2013-12-29 01:37:44 | 显示全部楼层 |阅读模式
本帖最后由 大鱼 于 2013-12-29 15:04 编辑

大家好,我是一个刚接触R语言新手,对很多概念不是很理解。
今天我在看一段程序的时候遇到一句代码,如下:
apply(data, 1, FUN=function(x){x%*%t(x)})
我查看文档以后对该语句的理解是,对data数据每一行调用一次function,并将该行做为参数传递给function.而x%*%t(x)应该是矩阵乘法的意思。

但是在计算中我发现了问题,例如:
我令data=matrix(seq(1,4),1,4)
> data
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
> apply(data, 1, FUN=function(x){x%*%t(x)})
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
[5,]    2
[6,]    4
[7,]    6
[8,]    8
[9,]    3
[10,]    6
[11,]    9
[12,]   12
[13,]    4
[14,]    8
[15,]   12
[16,]   16

上面是我输入命令以后的结果,这个结果让我十分不解,按照我的想法来讲,我觉得应该只返回一个数。
因为data只有一行,data与它的转置相乘应该是一个数才对。但是它竟然返回了16行1列的矩阵,我觉得十分疑惑。
我想请教大家,这种结果是怎么发生的?我在理解这句代码上有哪些误区?
——————————————————————————————————————————————————————————————————
问题已经自己解决,话说论坛的人气怎么这么低。
我把自己的想法写在下面,如果有人有和我一样的问题的话应该是能够解决的。

首先我理解的每次在data数据中提取一行的想法是对的,但是提取的每一行数据已经不是矩阵,而是一个一维的数组。
在function中,t(x)将一维数组转为一个矩阵,如果x是一个矩阵,返回的是x的转置,关于这个t函数的这个性质,可以很容易的在帮助文档中找到。所以x%*%t(x)的意思就变为 序列*矩阵。%*%是矩阵乘法的意思 ,x中的每一个数都会乘上一次t(x).
例如在上面的例子中
> x = seq(1,4)
> x
[1] 1 2 3 4.
>t(x) =
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
>x%*%t(x)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    2    4    6    8
[3,]    3    6    9   12
[4,]    4    8   12   16

从这里可以看出,元素个数是16个,但是为什么在用apply函数时会变成1列呢?下面会回答这个问题。
apply函数会返回一个矩阵,矩阵的列标记的是处理的行数的序号,在这个例子中,data数据只有一行,所以返回值只有一列,并把所有得到的结果放到这一列中。为了证明这一点,我做了一个实验。
> data =matrix(0,2,3)
> data[1,1:3] = 1:3
> data[2,1:3] = 1:3
> data
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
> apply(data, 1, FUN=function(x){x%*%t(x)})
      [,1] [,2]
[1,]    1    1
[2,]    2    2
[3,]    3    3
[4,]    2    2
[5,]    4    4
[6,]    6    6
[7,]    3    3
[8,]    6    6
[9,]    9    9
可以看出,返回值矩阵的列确实是按照data的行数组织的。
如果apply第二个参数时2,则apply按照data的列调用function,按照这样的话返回值应该是3列。
经过实验确实时这样。如下:
> apply(data, 2, FUN=function(x){x%*%t(x)})
     [,1] [,2] [,3]
[1,]    1    4    9
[2,]    1    4    9
[3,]    1    4    9
[4,]    1    4    9

总结:
经过实验和验证,这个问题得到了解决。因为我也是接触R语言,很多问题还要向大家请教。
所以如果有什么问题或者更正的话,可以通过我的邮箱联系dayu2014@gmail.com


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-25 07:51 , Processed in 0.022293 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表